Fix DRC errors and connect ESD clamp to SRAM vdd/vss
diff --git a/doitcode/frame.py b/doitcode/frame.py
index 8b06584..9bf5d39 100644
--- a/doitcode/frame.py
+++ b/doitcode/frame.py
@@ -83,8 +83,14 @@
"io_analog[2]": _geo.Rect(left=2326.97, bottom=3511.50, right=2351.97, top=3524.00),
"io_analog[3]": _geo.Rect(left=2066.97, bottom=3511.50, right=2091.97, top=3524.00),
"io_analog[4]": _geo.Rect(left=1594.97, bottom=3511.50, right=1619.97, top=3524.00),
+ "io_clamp_low[0]": _geo.Rect(left=1621.47, bottom=3511.50, right=1632.47, top=3524.00),
+ "io_clamp_high[0]": _geo.Rect(left=1633.97, bottom=3511.50, right=1644.97, top=3524.00),
"io_analog[5]": _geo.Rect(left=1086.47, bottom=3511.50, right=1111.47, top=3524.00),
+ "io_clamp_low[1]": _geo.Rect(left=1112.97, bottom=3511.50, right=1123.97, top=3524.00),
+ "io_clamp_high[1]": _geo.Rect(left=1125.47, bottom=3511.50, right=1136.47, top=3524.00),
"io_analog[6]": _geo.Rect(left=827.97, bottom=3511.50, right=852.97, top=3524.00),
+ "io_clamp_low[2]": _geo.Rect(left=854.47, bottom=3511.50, right=865.47, top=3524.00),
+ "io_clamp_high[2]": _geo.Rect(left=866.97, bottom=3511.50, right=877.97, top=3524.00),
"io_analog[7]": _geo.Rect(left=600.97, bottom=3511.50, right=625.97, top=3524.00),
"io_analog[8]": _geo.Rect(left=340.97, bottom=3511.50, right=365.97, top=3524.00),
"io_analog[9]": _geo.Rect(left=80.97, bottom=3511.50, right=105.97, top=3524.00),
diff --git a/doitcode/sram.py b/doitcode/sram.py
index 86edfb7..b0ddb51 100644
--- a/doitcode/sram.py
+++ b/doitcode/sram.py
@@ -84,8 +84,8 @@
_io_spec(sram_signal="d[1]", io_type="io_in", io_number=26),
_io_spec(sram_signal="d[0]", io_type="io_in", io_number=25),
_io_spec(sram_signal="q[0]", io_type="io_out", io_number=24),
- _io_spec(sram_signal="vss", io_type="io_analog", io_number=4),
- _io_spec(sram_signal="vdd", io_type="io_analog", io_number=5),
+ _io_spec(sram_signal="vdd", io_type="io_analog", io_number=4),
+ _io_spec(sram_signal="vss", io_type="io_analog", io_number=5),
)
io_sig2spec = {
spec.sram_signal: spec
@@ -271,10 +271,10 @@
dvss_rightrowm1bb = lay.bounds(mask=m1.mask)
assert dvss_rightrowm1bb.center.x < dvss_bb.center.x, "Internal error"
- w = dvss_rightrowm1bb.width
- h = dvss_bb.height
- x_via = dvss_rightrowm1bb.center.x
- y_via = dvss_bb.center.y
+ w = tech.on_grid(dvss_rightrowm1bb.width, mult=2, rounding="floor")
+ h = tech.on_grid(dvss_bb.height, mult=2, rounding="floor")
+ x_via = tech.on_grid(dvss_rightrowm1bb.center.x)
+ y_via = tech.on_grid(dvss_bb.center.y)
layouter.add_wire(
net=dvss, wire=via, x=x_via, y=y_via,
bottom_width=w, bottom_height=h, top_width=w, top_height=h,
@@ -301,10 +301,10 @@
dvdd_rightrowm1bb = lay.bounds(mask=m1.mask)
assert dvdd_rightrowm1bb.center.x < dvdd_bb.center.x, "Internal error"
- w = dvdd_rightrowm1bb.width
- h = dvdd_bb.height
- x_via = dvdd_rightrowm1bb.center.x
- y_via = dvdd_bb.center.y
+ w = tech.on_grid(dvdd_rightrowm1bb.width, mult=2, rounding="floor")
+ h = tech.on_grid(dvdd_bb.height, mult=2, rounding="floor")
+ x_via = tech.on_grid(dvdd_rightrowm1bb.center.x)
+ y_via = tech.on_grid(dvdd_bb.center.y)
layouter.add_wire(
net=dvdd, wire=via, x=x_via, y=y_via,
bottom_width=w, bottom_height=h, top_width=w, top_height=h,
@@ -428,41 +428,6 @@
bbs = tuple(ms.shape.bounds for ms in sram_lay.filter_polygons(
net=net, mask=m2pin.mask, depth=1, split=True,
))
- right = min(bb.right for bb in bbs)
- top = max(bb.top for bb in bbs)
- bottom = min(bb.bottom for bb in bbs)
- w = 10.0
- x_via2 = right - w/2.0
- left = right - w
-
- for bb in bbs:
- y_via2 = bb.center.y
- layouter.add_wire(
- net=net, wire=via2, x=x_via2, y=y_via2,
- bottom_width=w, bottom_enclosure="wide",
- top_width=w, top_enclosure="wide",
- )
-
- shape = _geo.Rect(
- left=left, bottom=bottom, right=right, top=(top + 20.0),
- )
- layouter.add_wire(net=net, wire=m3, shape=shape)
- shape = _geo.Rect(
- left=left, bottom=(top + 10.0), right=toppin_bb.right, top=(top+20.0),
- )
- layouter.add_wire(net=net, wire=m3, shape=shape)
- shape = _geo.Rect.from_rect(rect=toppin_bb, bottom=(top + 10.0))
- layouter.add_wire(net=net, wire=m3, shape=shape)
- layouter.add_wire(net=net, wire=m3, pin=m3pin, shape=toppin_bb)
-
- # vdd
- spec = io_sig2spec["vdd"]
- sram_port = sram.ports[spec.sram_signal]
- net = ckt.new_net(name=spec.toppin_name, external=True, childports=sram_port)
- toppin_bb = _frm.toppins[spec.toppin_name]
- bbs = tuple(ms.shape.bounds for ms in sram_lay.filter_polygons(
- net=net, mask=m2pin.mask, depth=1, split=True,
- ))
left = max(bb.left for bb in bbs)
top = max(bb.top for bb in bbs)
bottom = min(bb.bottom for bb in bbs)
@@ -490,6 +455,57 @@
layouter.add_wire(net=net, wire=m3, shape=shape)
layouter.add_wire(net=net, wire=m3, pin=m3pin, shape=toppin_bb)
+ # io_clamp_low
+ clamp_bb = _frm.toppins["io_clamp_low[1]"]
+ shape = _geo.Rect.from_rect(rect=clamp_bb, bottom=(top + 10))
+ layouter.add_wire(net=net, wire=m3, shape=shape)
+
+ # vdd
+ spec = io_sig2spec["vdd"]
+ sram_port = sram.ports[spec.sram_signal]
+ net = ckt.new_net(name=spec.toppin_name, external=True, childports=sram_port)
+ toppin_bb = _frm.toppins[spec.toppin_name]
+ bbs = tuple(ms.shape.bounds for ms in sram_lay.filter_polygons(
+ net=net, mask=m2pin.mask, depth=1, split=True,
+ ))
+ right = min(bb.right for bb in bbs)
+ top = max(bb.top for bb in bbs)
+ bottom = min(bb.bottom for bb in bbs)
+ w = 10.0
+ x_via2 = right - w/2.0
+ left = right - w
+
+ for bb in bbs:
+ y_via2 = bb.center.y
+ layouter.add_wire(
+ net=net, wire=via2, x=x_via2, y=y_via2,
+ bottom_width=w, bottom_enclosure="wide",
+ top_width=w, top_enclosure="wide",
+ )
+
+ shape = _geo.Rect(
+ left=left, bottom=bottom, right=right, top=(top + 20.0),
+ )
+ layouter.add_wire(net=net, wire=m3, shape=shape)
+ shape = _geo.Rect(
+ left=left, bottom=(top + 10.0), right=toppin_bb.right, top=(top + 20.0),
+ )
+ layouter.add_wire(net=net, wire=m3, shape=shape)
+ shape = _geo.Rect.from_rect(rect=toppin_bb, bottom=(top + 10.0))
+ layouter.add_wire(net=net, wire=m3, shape=shape)
+ layouter.add_wire(net=net, wire=m3, pin=m3pin, shape=toppin_bb)
+
+ # io_clamp_high
+ clamp_bb = _frm.toppins["io_clamp_high[1]"]
+ w = clamp_bb.width
+ shape = _geo.Rect.from_rect(rect=clamp_bb, bottom=(clamp_bb.bottom - 2*w))
+ layouter.add_wire(net=net, wire=m3, shape=shape)
+ shape = _geo.Rect(
+ left=clamp_bb.left, bottom=(clamp_bb.bottom - 2*w),
+ right=toppin_bb.right, top=(clamp_bb.bottom - w)
+ )
+ layouter.add_wire(net=net, wire=m3, shape=shape)
+
# connect the input signals
a_col = 0
for sig_name in (
@@ -560,7 +576,10 @@
# place buf
_buf_rotilipinbb = rot*_buf_ilipinbb
- y_buf = toppin_bb.top - _buf_rotilipinbb.bottom
+ y_buf = tech.on_grid(
+ toppin_bb.top - _buf_rotilipinbb.bottom,
+ mult=2,
+ )
buf_lay = layouter.place(buf, x=x_row, y=y_buf, rotation=rot)
pinbuf_lipinbb = buf_lay.bounds(mask=lipin.mask, net=pin_net, depth=1)
sigbuf_lipinbb = buf_lay.bounds(mask=lipin.mask, net=sig_net, depth=1)
@@ -596,21 +615,20 @@
oneoeb_lipinbb = one_lay.bounds(mask=lipin.mask, net=oeb_net, depth=1)
# connect pin_net
- w = pinbuf_lipinbb.width
- x_via = pinbuf_lipinbb.center.x
- y_via = pinbuf_lipinbb.center.y
+ w = tech.on_grid(pinbuf_lipinbb.width, mult=2, rounding="floor")
+ o_via = tech.on_grid(pinbuf_lipinbb.center)
layouter.add_wire(
- net=pin_net, wire=mcon, x=x_via, y=y_via,
+ net=pin_net, wire=mcon, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
layouter.add_wire(
- net=pin_net, wire=via, x=x_via, y=y_via,
+ net=pin_net, wire=via, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via2_lay = layouter.add_wire(
- net=pin_net, wire=via2, x=x_via, y=y_via,
+ net=pin_net, wire=via2, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
@@ -624,28 +642,27 @@
layouter.add_wire(net=pin_net, wire=m3, pin=m3pin, shape=toppin_bb)
# connect sig_net
- w = sigbuf_lipinbb.width
- x_via = sigbuf_lipinbb.center.x
- y_via = sigbuf_lipinbb.center.y
+ w = tech.on_grid(sigbuf_lipinbb.width, mult=2, rounding="floor")
+ o_via = tech.on_grid(sigbuf_lipinbb.center)
layouter.add_wire(
- net=sig_net, wire=mcon, x=x_via, y=y_via,
+ net=sig_net, wire=mcon, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
layouter.add_wire(
- net=sig_net, wire=via, x=x_via, y=y_via,
+ net=sig_net, wire=via, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via2_lay = layouter.add_wire(
- net=sig_net, wire=via2, x=x_via, y=y_via,
+ net=sig_net, wire=via2, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via2_m3bb1 = via2_lay.bounds(mask=m3.mask)
_via2_lay = layouter.wire_layout(
- net=sig_net, wire=via2, rows=6, columns=6,
+ net=sig_net, wire=via2, rows=6, columns=3,
)
_via2_m2bb = _via2_lay.bounds(mask=m2.mask)
if is_leftrow:
@@ -666,24 +683,23 @@
layouter.add_wire(net=sig_net, wire=m3, shape=shape)
# connect oeb_net
- w = oneoeb_lipinbb.width
- x_via = oneoeb_lipinbb.center.x
- y_via = oneoeb_lipinbb.center.y
+ w = tech.on_grid(oneoeb_lipinbb.width, mult=2, rounding="floor")
+ o_via = tech.on_grid(oneoeb_lipinbb.center)
layouter.add_wire(
- net=oeb_net, wire=mcon, x=x_via, y=y_via,
+ net=oeb_net, wire=mcon, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via_lay = layouter.add_wire(
- net=oeb_net, wire=via, x=x_via, y=y_via,
+ net=oeb_net, wire=via, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via_m2bb = via_lay.bounds(mask=m2.mask)
- y_via2 = oeb_bb.center.y
+ o_via2 = _geo.Point.from_point(point=o_via, y=oeb_bb.center.y)
via2_lay = layouter.add_wire(
- net=oeb_net, wire=via2, x=x_via, y=y_via2,
+ net=oeb_net, wire=via2, origin=o_via2,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
@@ -704,21 +720,20 @@
layouter.add_wire(net=oeb_net, wire=m3, pin=m3pin, shape=oeb_bb)
# connect out_net
- w = zeroout_lipinbb.width
- x_via = zeroout_lipinbb.center.x
- y_via = zeroout_lipinbb.center.y
+ w = tech.on_grid(zeroout_lipinbb.width, mult=2, rounding="floor")
+ o_via = tech.on_grid(zeroout_lipinbb.center)
layouter.add_wire(
- net=out_net, wire=mcon, x=x_via, y=y_via,
+ net=out_net, wire=mcon, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
layouter.add_wire(
- net=out_net, wire=via, x=x_via, y=y_via,
+ net=out_net, wire=via, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via2_lay = layouter.add_wire(
- net=out_net, wire=via2, x=x_via, y=y_via,
+ net=out_net, wire=via2, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
@@ -776,7 +791,10 @@
rot = rot_midrow
y_row = y_midrow
_buf_rotilipinbb = rot*_buf_ilipinbb
- x_buf = sram_m2pinbb.right - _buf_rotilipinbb.left
+ x_buf = tech.on_grid(
+ sram_m2pinbb.right - _buf_rotilipinbb.left,
+ mult=2, rounding="ceiling",
+ )
buf_lay = layouter.place(buf, x=x_buf, y=y_row, rotation=rot)
pinbuf_lipinbb = buf_lay.bounds(mask=lipin.mask, net=pin_net, depth=1)
sigbuf_lipinbb = buf_lay.bounds(mask=lipin.mask, net=sig_net, depth=1)
@@ -799,16 +817,15 @@
layouter.place(tie, x=x_row, y=y_tie, rotation=rot)
# connect sig_net
- h = sigbuf_lipinbb.height
- x_via = sigbuf_lipinbb.center.x
- y_via = sigbuf_lipinbb.center.y
+ h = tech.on_grid(sigbuf_lipinbb.height, mult=2, rounding="floor")
+ o_via = tech.on_grid(sigbuf_lipinbb.center)
layouter.add_wire(
- net=sig_net, wire=mcon, x=x_via, y=y_via,
+ net=sig_net, wire=mcon, origin=o_via,
bottom_height=h, bottom_enclosure="tall",
top_height=h, top_enclosure="tall",
)
via_lay = layouter.add_wire(
- net=sig_net, wire=via, x=x_via, y=y_via,
+ net=sig_net, wire=via, origin=o_via,
bottom_height=h, bottom_enclosure="tall",
top_height=h, top_enclosure="tall",
)
@@ -818,24 +835,23 @@
layouter.add_wire(net=sig_net, wire=m2, shape=shape)
# connect pin_net
- h = pinbuf_lipinbb.height
- x_via = pinbuf_lipinbb.center.x
- y_via = pinbuf_lipinbb.center.y
+ h = tech.on_grid(pinbuf_lipinbb.height, mult=2, rounding="floor")
+ o_via = tech.on_grid(pinbuf_lipinbb.center)
layouter.add_wire(
- net=sig_net, wire=mcon, x=x_via, y=y_via,
+ net=sig_net, wire=mcon, origin=o_via,
bottom_height=h, bottom_enclosure="tall",
top_height=h, top_enclosure="tall",
)
via_lay = layouter.add_wire(
- net=sig_net, wire=via, x=x_via, y=y_via,
+ net=sig_net, wire=via, origin=o_via,
bottom_height=h, bottom_enclosure="tall",
top_height=h, top_enclosure="tall",
)
via_m2bb = via_lay.bounds(mask=m2.mask)
_via2_lay = layouter.wire_layout(
- net=pin_net, wire=via2, rows=6, columns=6,
+ net=pin_net, wire=via2, rows=6, columns=3,
)
_via2_m2bb = _via2_lay.bounds(mask=m2.mask)
if is_leftrow:
@@ -857,21 +873,20 @@
layouter.add_wire(net=pin_net, wire=m3, pin=m3pin, shape=toppin_bb)
# connect oeb_net
- w = zero_zerolipinbb.width
- x_via = zero_zerolipinbb.center.x
- y_via = zero_zerolipinbb.center.y
+ w = tech.on_grid(zero_zerolipinbb.width, mult=2, rounding="floor")
+ o_via = tech.on_grid(zero_zerolipinbb.center)
layouter.add_wire(
- net=oeb_net, wire=mcon, x=x_via, y=y_via,
+ net=oeb_net, wire=mcon, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
layouter.add_wire(
- net=oeb_net, wire=via, x=x_via, y=y_via,
+ net=oeb_net, wire=via, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
via2_lay = layouter.add_wire(
- net=oeb_net, wire=via2, x=x_via, y=y_via,
+ net=oeb_net, wire=via2, origin=o_via,
bottom_width=w, bottom_enclosure="wide",
top_width=w, top_enclosure="wide",
)
diff --git a/gds/user_analog_project_wrapper.gds.gz b/gds/user_analog_project_wrapper.gds.gz
index 9d084bf..e6b360b 100644
--- a/gds/user_analog_project_wrapper.gds.gz
+++ b/gds/user_analog_project_wrapper.gds.gz
Binary files differ