Skip to content

Commit 3cbd4d3

Browse files
added ipm and removed user_defines.v from openframe
1 parent a318fdc commit 3cbd4d3

4 files changed

Lines changed: 36 additions & 16 deletions

File tree

chipfoundry_cli/main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,9 +1313,10 @@ def push(project_root, sftp_host, sftp_username, sftp_key, project_id, project_n
13131313
sftp_base = f"incoming/projects/{final_project_name}"
13141314
upload_map = {
13151315
".cf/project.json": project_json_path,
1316-
"verilog/rtl/user_defines.v": collected["verilog/rtl/user_defines.v"],
13171316
}
1318-
1317+
if detected_type != "openframe":
1318+
upload_map["verilog/rtl/user_defines.v"] = collected.get("verilog/rtl/user_defines.v")
1319+
13191320
# Add the appropriate GDS file based on what was collected
13201321
for gds_key, gds_path in collected.items():
13211322
if gds_key.startswith("gds/"):

chipfoundry_cli/utils.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,12 @@ def collect_project_files(project_root: str) -> Dict[str, Optional[str]]:
3030
Collect required project files from the given project_root.
3131
Returns a dict mapping logical names to absolute file paths (or None if not found and optional).
3232
Raises FileNotFoundError if any required file is missing.
33+
Openframe projects do not require user_defines.v.
3334
"""
3435
project_root = Path(project_root)
3536
collected = {}
36-
37-
# Collect standard required files
38-
for rel_path, required in REQUIRED_FILES.items():
39-
abs_path = project_root / rel_path
40-
if abs_path.exists():
41-
collected[rel_path] = str(abs_path)
42-
elif required:
43-
raise FileNotFoundError(f"Required file not found: {abs_path}")
44-
else:
45-
collected[rel_path] = None
46-
47-
# Collect GDS file based on what exists
37+
38+
# Collect GDS file first to determine project type (affects whether user_defines.v is required)
4839
gds_dir = project_root / 'gds'
4940
if gds_dir.exists():
5041
found_gds_files = []
@@ -107,7 +98,22 @@ def collect_project_files(project_root: str) -> Dict[str, Optional[str]]:
10798

10899
gds_name, gds_path = gds_file_to_use
109100
collected[f"gds/{gds_name}"] = gds_path
110-
101+
102+
# Collect standard required files (user_defines.v not required for openframe)
103+
cf_json_path = project_root / ".cf" / "project.json"
104+
collected[".cf/project.json"] = str(cf_json_path) if cf_json_path.exists() else None
105+
106+
user_defines_path = project_root / "verilog" / "rtl" / "user_defines.v"
107+
if project_type == "openframe":
108+
collected["verilog/rtl/user_defines.v"] = None # openframe does not use user_defines.v
109+
else:
110+
if user_defines_path.exists():
111+
collected["verilog/rtl/user_defines.v"] = str(user_defines_path)
112+
else:
113+
raise FileNotFoundError(f"Required file not found: {user_defines_path}")
114+
else:
115+
raise FileNotFoundError(f"No GDS directory found at {gds_dir}. Expected one of: {list(GDS_TYPE_MAP.keys())}")
116+
111117
return collected
112118

113119
def ensure_cf_directory(target_dir: str):

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "chipfoundry-cli"
3-
version = "1.4.1"
3+
version = "1.4.2"
44
description = "CLI tool to automate ChipFoundry project submission to SFTP server"
55
authors = ["ChipFoundry <marwan.abbas@chipfoundry.io>"]
66
readme = "README.md"
@@ -17,6 +17,7 @@ paramiko = ">=3.0.0,<4"
1717
toml = ">=0.10,<1.0"
1818
httpx = ">=0.24.0,<1.0"
1919
textual = ">=0.40.0,<1"
20+
cf-ipm = "*"
2021

2122
[tool.poetry.group.dev.dependencies]
2223
wheel = "*"

tests/test_utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,18 @@ def test_collect_rejects_compressed_and_uncompressed(self, temp_project_dir):
139139
collect_project_files(temp_project_dir)
140140
assert 'compressed and uncompressed' in str(exc_info.value).lower()
141141

142+
def test_collect_openframe_without_user_defines_v(self, temp_project_dir):
143+
"""Test that openframe projects do not require user_defines.v."""
144+
project_root = Path(temp_project_dir)
145+
gds_dir = project_root / 'gds'
146+
gds_dir.mkdir(parents=True, exist_ok=True)
147+
(gds_dir / 'openframe_project_wrapper.gds').write_text('gds')
148+
# No verilog/rtl/user_defines.v
149+
150+
collected = collect_project_files(temp_project_dir)
151+
assert 'gds/openframe_project_wrapper.gds' in collected
152+
assert collected['verilog/rtl/user_defines.v'] is None
153+
142154

143155
class TestEnsureCfDirectory:
144156
"""Test ensure_cf_directory function."""

0 commit comments

Comments
 (0)