Skip to content

Commit 126e07d

Browse files
committed
Prepare beta 11 release
1 parent 0ee8efd commit 126e07d

4 files changed

Lines changed: 83 additions & 13 deletions

File tree

app/core/spice_tools.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,18 @@ def build_generated_netlist(
9898
cleaned_lines: list[str] = []
9999
inserted = False
100100
wrapper_lines = _auto_wrapper_lines(source_text, preferred_subckt, wrapper_options or {})
101+
source_lines = _normalize_split_initial_conditions(source_text.splitlines())
102+
in_control_block = False
101103

102-
for line in source_text.splitlines():
104+
for line in source_lines:
103105
stripped = line.strip().lower()
106+
if stripped.startswith(".control"):
107+
in_control_block = True
108+
continue
109+
if in_control_block:
110+
if stripped.startswith(".endc"):
111+
in_control_block = False
112+
continue
104113
if stripped.startswith(ANALYSIS_DIRECTIVES):
105114
continue
106115
if not inserted and stripped == ".end":
@@ -119,6 +128,29 @@ def build_generated_netlist(
119128
return "\n".join(cleaned_lines).rstrip() + "\n"
120129

121130

131+
def _normalize_split_initial_conditions(lines: list[str]) -> list[str]:
132+
"""Join Xschem-wrapped .ic value lines such as `.ic ...` followed by `v(n)=...`."""
133+
normalized: list[str] = []
134+
index = 0
135+
while index < len(lines):
136+
line = lines[index]
137+
stripped = line.strip()
138+
if stripped.lower().startswith(".ic "):
139+
merged = line.rstrip()
140+
index += 1
141+
while index < len(lines):
142+
continuation = lines[index].strip()
143+
if not continuation.lower().startswith("v("):
144+
break
145+
merged = f"{merged} {continuation}"
146+
index += 1
147+
normalized.append(merged)
148+
continue
149+
normalized.append(line)
150+
index += 1
151+
return normalized
152+
153+
122154
def ensure_sky130_model_lib(source_text: str, sky130a_path: str) -> str:
123155
"""Prepend the SKY130 model library when an extracted netlist needs it."""
124156
lowered = source_text.lower()

app/data/dependency_manifest.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@
5858
"bundle": {
5959
"enabled": true,
6060
"name": "tt-pdk-sky130a",
61-
"version": "0.2.0-beta.10",
61+
"version": "0.2.0-beta.11",
6262
"install_root": "~/pdk",
6363
"cache_root": "~/.cache/sky130-flow-gui/pdk",
6464
"minimum_free_gb": 10,
65-
"asset_url": "https://github.com/ROMERUU-dev/sky130-flow-gui/releases/download/v0.2.0-beta.10/tt-pdk-sky130a_0.2.0-beta.10.tar.gz",
66-
"asset_filename": "tt-pdk-sky130a_0.2.0-beta.10.tar.gz",
67-
"asset_sha256": "5175df9dea3d3d77b5735fbf8433b750693036ff9046ba61c3423d5c0277acac"
65+
"asset_url": "https://github.com/ROMERUU-dev/sky130-flow-gui/releases/download/v0.2.0-beta.11/tt-pdk-sky130a_0.2.0-beta.11.tar.gz",
66+
"asset_filename": "tt-pdk-sky130a_0.2.0-beta.11.tar.gz",
67+
"asset_sha256": "39f8d2ea31ed068b845d379cc8418c3602793eef8f9a887374ea3b2f2bbe09af"
6868
},
6969
"preferred_sources": [
7070
"settings",
@@ -139,13 +139,13 @@
139139
"bundle": {
140140
"enabled": true,
141141
"name": "tt-pdk-sky130a",
142-
"version": "0.2.0-beta.10",
142+
"version": "0.2.0-beta.11",
143143
"install_root": "~/pdk",
144144
"cache_root": "~/.cache/sky130-flow-gui/pdk",
145145
"minimum_free_gb": 10,
146-
"asset_url": "https://github.com/ROMERUU-dev/sky130-flow-gui/releases/download/v0.2.0-beta.10/tt-pdk-sky130a_0.2.0-beta.10.tar.gz",
147-
"asset_filename": "tt-pdk-sky130a_0.2.0-beta.10.tar.gz",
148-
"asset_sha256": "5175df9dea3d3d77b5735fbf8433b750693036ff9046ba61c3423d5c0277acac"
146+
"asset_url": "https://github.com/ROMERUU-dev/sky130-flow-gui/releases/download/v0.2.0-beta.11/tt-pdk-sky130a_0.2.0-beta.11.tar.gz",
147+
"asset_filename": "tt-pdk-sky130a_0.2.0-beta.11.tar.gz",
148+
"asset_sha256": "39f8d2ea31ed068b845d379cc8418c3602793eef8f9a887374ea3b2f2bbe09af"
149149
},
150150
"preferred_sources": [
151151
"settings",

tests/test_dependency_manifest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ def test_loads_default_channel_and_packages(self) -> None:
2424
self.assertEqual(channel.pdk_bundle_install_root, "~/pdk")
2525
self.assertEqual(channel.pdk_bundle_name, "tt-pdk-sky130a")
2626
self.assertTrue(channel.pdk_bundle_enabled)
27-
self.assertEqual(channel.pdk_bundle_version, "0.2.0-beta.10")
27+
self.assertEqual(channel.pdk_bundle_version, "0.2.0-beta.11")
2828
self.assertEqual(
2929
channel.pdk_bundle_asset_url,
30-
"https://github.com/ROMERUU-dev/sky130-flow-gui/releases/download/v0.2.0-beta.10/tt-pdk-sky130a_0.2.0-beta.10.tar.gz",
30+
"https://github.com/ROMERUU-dev/sky130-flow-gui/releases/download/v0.2.0-beta.11/tt-pdk-sky130a_0.2.0-beta.11.tar.gz",
3131
)
32-
self.assertEqual(channel.pdk_bundle_asset_filename, "tt-pdk-sky130a_0.2.0-beta.10.tar.gz")
32+
self.assertEqual(channel.pdk_bundle_asset_filename, "tt-pdk-sky130a_0.2.0-beta.11.tar.gz")
3333
self.assertEqual(
3434
channel.pdk_bundle_asset_sha256,
35-
"5175df9dea3d3d77b5735fbf8433b750693036ff9046ba61c3423d5c0277acac",
35+
"39f8d2ea31ed068b845d379cc8418c3602793eef8f9a887374ea3b2f2bbe09af",
3636
)
3737

3838
def test_unknown_channel_raises(self) -> None:

tests/test_postlayout_flow.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,44 @@ def test_wrapper_mode_none_only_injects_analysis_directives(self) -> None:
174174
self.assertNotIn("Auto-generated wrapper", generated)
175175
self.assertIn(".tran 1n 1u", generated)
176176

177+
def test_generated_netlist_ignores_source_control_block_and_joins_split_ic(self) -> None:
178+
source = "\n".join(
179+
[
180+
".lib /pdk/sky130A/libs.tech/combined/sky130.lib.spice tt",
181+
"X1 net1 VGND VGND VDPWR VDPWR net2 sky130_fd_sc_hd__inv_1",
182+
".ic v(net1)=0.95 v(net2)=0.65 v(net3)=0.05",
183+
" v(net4)=0.35",
184+
".control",
185+
"save v(net1)",
186+
"tran 0.1n 20n uic",
187+
"write /broken-",
188+
"path/out.raw",
189+
".endc",
190+
".end",
191+
]
192+
)
193+
194+
generated = build_generated_netlist(
195+
source_text=source,
196+
analysis_type="Transient",
197+
analysis_params={
198+
"tran_step": "0.2n",
199+
"tran_stop": "1u",
200+
"tran_uic": "1",
201+
"save_mode": "Selected probes only",
202+
},
203+
save_points=["net1", "net2"],
204+
extra_directives="",
205+
wrapper_options={"wrapper_mode": "none"},
206+
)
207+
208+
self.assertIn(".ic v(net1)=0.95 v(net2)=0.65 v(net3)=0.05 v(net4)=0.35", generated)
209+
self.assertIn(".save v(net1) v(net2)", generated)
210+
self.assertIn(".tran 0.2n 1u uic", generated)
211+
self.assertNotIn(".control", generated)
212+
self.assertNotIn("write /broken-", generated)
213+
self.assertNotIn("path/out.raw", generated)
214+
177215
def test_tiny_tapeout_wrapper_uses_configured_clock_and_analog_pin_roles(self) -> None:
178216
source = "\n".join(
179217
[

0 commit comments

Comments
 (0)