Skip to content

Commit 92ecdea

Browse files
Add double_wide openframe project type support.
Detect double_wide_openframe_project_wrapper GDS, use the double-wide XOR erase box, and extend LVS/OEB/CVC defaults for 59-GPIO padframes. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 5360030 commit 92ecdea

17 files changed

Lines changed: 241 additions & 12 deletions

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,36 @@ cf-precheck -i ./my_project -p $PDK_ROOT/sky130A -c ./caravel --magic-drc
6060
cf-precheck -i ./my_project -p $PDK_ROOT/sky130A -c ./caravel --skip-checks lvs oeb
6161
```
6262

63+
## Double-wide openframe
64+
65+
Double-wide projects are detected when exactly one of these GDS files is present:
66+
67+
`gds/double_wide_openframe_project_wrapper.gds`
68+
69+
| Field | Value |
70+
|-------|--------|
71+
| Type | `double_wide` |
72+
| User module | `double_wide_openframe_project_wrapper` |
73+
| Top module | `double_wide_chip_io` |
74+
| Golden wrapper | `double_wide_openframe_project_wrapper_empty` |
75+
| User area | 6754.63 × 4766.63 µm (59 GPIOs) |
76+
77+
Pass the double-wide **harness** root (not stock Caravel) as `-c`. That root must
78+
provide:
79+
80+
- `gds/double_wide_openframe_project_wrapper_empty.gds`
81+
- `verilog/rtl/__double_wide_openframe_project_wrapper.v` (port-list golden)
82+
83+
```bash
84+
cf-precheck \
85+
-i ../dw_openframe_user_project \
86+
-p $PDK_ROOT/sky130A \
87+
-c ../dw_openframe
88+
```
89+
90+
XOR uses `erase_box_double_wide.tcl` (scaled openframe perimeter erase). OEB uses
91+
the openframe CVC path with GPIO indices `0..58`.
92+
6393
## Checks
6494

6595
| Check | Description |

src/cf_precheck/be_checks/run_openframe_check

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,14 @@ ERROR: Could not create $WORK_ROOT/cvcrc.oeb"
129129
fi
130130

131131
if [[ "$DESIGN_NAME" == *openframe_project_wrapper ]]; then
132+
# Standard openframe: 44 GPIOs (0..43). Double-wide: 59 GPIOs (0..58).
133+
if [[ "$DESIGN_NAME" == *double_wide* ]]; then
134+
gpio_max=58
135+
else
136+
gpio_max=43
137+
fi
132138
echo "c 6" >$WORK_ROOT/cvc.oeb.script
133-
for ((i = 0; i <= 43; i++)); do
139+
for ((i = 0; i <= gpio_max; i++)); do
134140
cat >>$WORK_ROOT/cvc.oeb.script <<-cvcin
135141
gn analog_io[$i]
136142
gn analog_noesd_io[$i]
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
por_l input min@0.0 max@1.8
2+
porb_h input min@0.0 max@3.3
3+
porb_l input min@0.0 max@1.8
4+
resetb_h input min@0.0 max@3.3
5+
resetb_l input min@0.0 max@1.8
6+
vccd1 power 1.8
7+
vdda1 power 3.3
8+
vssa1 power 0.0
9+
vssio power 0.0
10+
vccd2 power 1.8
11+
vddio power 3.3
12+
vssa2 power 0.0
13+
vdda2 power 3.3
14+
vdda power 3.3
15+
vssd1 power 0.0
16+
vssd2 power vssd1
17+
vccd power 1.8
18+
vssa power 0.0
19+
vssd power 0.0
20+
analog_io
21+
analog_noesd_io
22+
gpio_analog_en[*] expectMin@0.0 expectMax@1.8
23+
gpio_analog_pol[*] expectMin@0.0 expectMax@1.8
24+
gpio_analog_sel[*] expectMin@0.0 expectMax@1.8
25+
gpio_dm0[*] expectMin@0.0 expectMax@1.8
26+
gpio_dm1[*] expectMin@0.0 expectMax@1.8
27+
gpio_dm2[*] expectMin@0.0 expectMax@1.8
28+
gpio_holdover[*] expectMin@0.0 expectMax@1.8
29+
gpio_ib_mode_sel[*] expectMin@0.0 expectMax@1.8
30+
gpio_in[*] input min@0.0 max@1.8
31+
gpio_in_h[*] input min@0.0 max@3.3
32+
gpio_inp_dis[*] expectMin@0.0 expectMax@1.8
33+
gpio_loopback_one[*] input 1.8
34+
gpio_loopback_zero[*] input 0.0
35+
gpio_oeb[*] expectMin@0.0 expectMax@1.8
36+
gpio_out[*] expectMin@0.0 expectMax@1.8
37+
gpio_slow_sel[*] expectMin@0.0 expectMax@1.8
38+
gpio_vtrip_sel[*] expectMin@0.0 expectMax@1.8
39+
mask_rev[*] input min@0.0 max@1.8
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"STD_CELL_LIBRARY": "sky130_fd_sc_hd",
3+
"INCLUDE_CONFIGS": [
4+
"$LVS_ROOT/tech/$PDK/lvs_config.base.json"
5+
],
6+
"TOP_SOURCE": "double_wide_openframe_project_wrapper",
7+
"TOP_LAYOUT": "$TOP_SOURCE",
8+
"EXTRACT_FLATGLOB": [
9+
""
10+
],
11+
"EXTRACT_ABSTRACT": [
12+
""
13+
],
14+
"EXTRACT_CREATE_SUBCUT": [
15+
""
16+
],
17+
"LVS_FLATTEN": [
18+
""
19+
],
20+
"LVS_NOFLATTEN": [
21+
""
22+
],
23+
"LVS_IGNORE": [
24+
""
25+
],
26+
"LVS_SPICE_FILES": [
27+
""
28+
],
29+
"LVS_VERILOG_FILES": [
30+
"$UPRJ_ROOT/verilog/gl/double_wide_openframe_project_wrapper.v"
31+
],
32+
"LAYOUT_FILE": "$UPRJ_ROOT/gds/double_wide_openframe_project_wrapper.gds"
33+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
por_l input min@0.0 max@1.8
2+
porb_h input min@0.0 max@3.3
3+
porb_l input min@0.0 max@1.8
4+
resetb_h input min@0.0 max@3.3
5+
resetb_l input min@0.0 max@1.8
6+
vccd1 power 1.8
7+
vdda1 power 3.3
8+
vssa1 power 0.0
9+
vssio power 0.0
10+
vccd2 power 1.8
11+
vddio power 3.3
12+
vssa2 power 0.0
13+
vdda2 power 3.3
14+
vdda power 3.3
15+
vssd1 power 0.0
16+
vssd2 power vssd1
17+
vccd power 1.8
18+
vssa power 0.0
19+
vssd power 0.0
20+
analog_io
21+
analog_noesd_io
22+
gpio_analog_en[*] expectMin@0.0 expectMax@1.8
23+
gpio_analog_pol[*] expectMin@0.0 expectMax@1.8
24+
gpio_analog_sel[*] expectMin@0.0 expectMax@1.8
25+
gpio_dm0[*] expectMin@0.0 expectMax@1.8
26+
gpio_dm1[*] expectMin@0.0 expectMax@1.8
27+
gpio_dm2[*] expectMin@0.0 expectMax@1.8
28+
gpio_holdover[*] expectMin@0.0 expectMax@1.8
29+
gpio_ib_mode_sel[*] expectMin@0.0 expectMax@1.8
30+
gpio_in[*] input min@0.0 max@1.8
31+
gpio_in_h[*] input min@0.0 max@3.3
32+
gpio_inp_dis[*] expectMin@0.0 expectMax@1.8
33+
gpio_loopback_one[*] input 1.8
34+
gpio_loopback_zero[*] input 0.0
35+
gpio_oeb[*] expectMin@0.0 expectMax@1.8
36+
gpio_out[*] expectMin@0.0 expectMax@1.8
37+
gpio_slow_sel[*] expectMin@0.0 expectMax@1.8
38+
gpio_vtrip_sel[*] expectMin@0.0 expectMax@1.8
39+
mask_rev[*] input min@0.0 max@1.8
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"STD_CELL_LIBRARY": "sky130_fd_sc_hd",
3+
"INCLUDE_CONFIGS": [
4+
"$LVS_ROOT/tech/$PDK/lvs_config.base.json"
5+
],
6+
"TOP_SOURCE": "double_wide_openframe_project_wrapper",
7+
"TOP_LAYOUT": "$TOP_SOURCE",
8+
"EXTRACT_FLATGLOB": [
9+
""
10+
],
11+
"EXTRACT_ABSTRACT": [
12+
""
13+
],
14+
"EXTRACT_CREATE_SUBCUT": [
15+
""
16+
],
17+
"LVS_FLATTEN": [
18+
""
19+
],
20+
"LVS_NOFLATTEN": [
21+
""
22+
],
23+
"LVS_IGNORE": [
24+
""
25+
],
26+
"LVS_SPICE_FILES": [
27+
""
28+
],
29+
"LVS_VERILOG_FILES": [
30+
"$UPRJ_ROOT/verilog/gl/double_wide_openframe_project_wrapper.v"
31+
],
32+
"LAYOUT_FILE": "$UPRJ_ROOT/gds/double_wide_openframe_project_wrapper.gds"
33+
}

src/cf_precheck/check_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class CheckManager:
3030
__ref__: str | None = None
3131
__surname__: str | None = None
3232
__supported_pdks__: list[str] | None = None
33-
__supported_type__: list[str] = ["analog", "digital", "openframe", "mini"]
33+
__supported_type__: list[str] = ["analog", "digital", "openframe", "mini", "double_wide"]
3434
__optional__: bool = False
3535

3636
def __init__(self, precheck_config: dict, project_config: dict):

src/cf_precheck/checks/illegal_cellname.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class IllegalCellnameCheck:
2929
__ref__ = "illegal_cellname_check"
3030
__surname__ = "Illegal Cellname"
3131
__supported_pdks__ = ["sky130A", "sky130B"]
32-
__supported_type__ = ["analog", "digital", "openframe", "mini"]
32+
__supported_type__ = ["analog", "digital", "openframe", "mini", "double_wide"]
3333
__optional__ = False
3434

3535
def __init__(self, precheck_config: dict, project_config: dict):

src/cf_precheck/checks/klayout_drc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class _KlayoutDRCBase:
6666
__ref__: str | None = None
6767
__surname__: str | None = None
6868
__supported_pdks__: list[str] | None = None
69-
__supported_type__ = ["analog", "digital", "openframe", "mini"]
69+
__supported_type__ = ["analog", "digital", "openframe", "mini", "double_wide"]
7070
__optional__ = False
7171

7272
def __init__(self, precheck_config: dict, project_config: dict):

src/cf_precheck/checks/lvs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Lvs:
1818
__ref__ = "lvs"
1919
__surname__ = "LVS"
2020
__supported_pdks__ = ["gf180mcuC", "gf180mcuD", "sky130A", "sky130B"]
21-
__supported_type__ = ["analog", "digital", "openframe", "mini"]
21+
__supported_type__ = ["analog", "digital", "openframe", "mini", "double_wide"]
2222
__optional__ = False
2323

2424
def __init__(self, precheck_config: dict, project_config: dict):
@@ -30,6 +30,7 @@ def __init__(self, precheck_config: dict, project_config: dict):
3030
type_to_design = {
3131
"analog": "user_analog_project_wrapper",
3232
"openframe": "openframe_project_wrapper",
33+
"double_wide": "double_wide_openframe_project_wrapper",
3334
"mini": "user_project_wrapper_mini4",
3435
}
3536
self.design_name = type_to_design.get(proj_type, "user_project_wrapper")

0 commit comments

Comments
 (0)