Skip to content

Commit d93b931

Browse files
committed
ol2/tt_top: move dedicated analog pin routing to modules.yaml config file
Instead of hard-coding the config in the tt-multiplexer code.
1 parent ebd2ab4 commit d93b931

File tree

3 files changed

+38
-75
lines changed

3 files changed

+38
-75
lines changed

ol2/tt_top/odb_route_analog_pins.py

Lines changed: 34 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import click
1212
import odb
1313

14+
sys.path.append('../../py')
15+
import tt
16+
1417
try:
1518
from reader import click_odb
1619
interactive = False
@@ -25,6 +28,7 @@
2528
def route_analog_pins(
2629
reader,
2730
):
31+
tti = tt.TinyTapeout()
2832

2933
# Manual routing for analog pins
3034
tech = reader.db.getTech()
@@ -39,76 +43,36 @@ def route_analog_pins(
3943
layer_rule.setSpacing(2700)
4044

4145
for inst in reader.block.getInsts():
42-
if inst.getMaster().getName() == "tt_um_htfab_r2r_dac":
43-
for term in inst.getITerms():
44-
net = term.getNet()
45-
if net.getName() == "pad_raw[58]":
46-
net.clearSpecial()
47-
net.setNonDefaultRule(analog_track)
48-
bbox = term.getBBox()
49-
wire = odb.dbWire.create(net)
50-
encoder = odb.dbWireEncoder()
51-
encoder.begin(wire)
52-
encoder.newPath(metal5, "FIXED", analog_track.getLayerRule(metal5))
53-
encoder.addPoint(bbox.xMin(), bbox.yCenter())
54-
encoder.addPoint(bbox.xMin() - 50000, bbox.yCenter())
55-
encoder.addTechVia(via4)
56-
encoder.addPoint(bbox.xMin() - 50000, 988490)
57-
encoder.addPoint(319855, 988490)
58-
encoder.addTechVia(via3)
59-
encoder.addPoint(319855, 987490)
60-
encoder.end()
61-
if inst.getMaster().getName() == "tt_um_algofoogle_antonalog":
62-
for term in inst.getITerms():
63-
net = term.getNet()
64-
if net.getName() == "pad_raw[59]":
65-
net.clearSpecial()
66-
net.setNonDefaultRule(analog_track)
67-
bbox = term.getBBox()
68-
wire = odb.dbWire.create(net)
69-
encoder = odb.dbWireEncoder()
70-
encoder.begin(wire)
71-
encoder.newPath(metal5, "FIXED", analog_track.getLayerRule(metal5))
72-
encoder.addPoint(bbox.xMin(), bbox.yCenter())
73-
encoder.addPoint(bbox.xMin() - 47300, bbox.yCenter())
74-
encoder.addTechVia(via4)
75-
encoder.addPoint(bbox.xMin() - 47300, 886490)
76-
encoder.addPoint(319855, 886490)
77-
encoder.addTechVia(via3)
78-
encoder.addPoint(319855, 884490)
79-
encoder.end()
80-
if net.getName() == "pad_raw[60]":
81-
net.clearSpecial()
82-
net.setNonDefaultRule(analog_track)
83-
bbox = term.getBBox()
84-
wire = odb.dbWire.create(net)
85-
encoder = odb.dbWireEncoder()
86-
encoder.begin(wire)
87-
encoder.newPath(metal5, "FIXED", analog_track.getLayerRule(metal5))
88-
encoder.addPoint(bbox.xMin(), bbox.yCenter())
89-
encoder.addPoint(bbox.xMin() - 50000, bbox.yCenter())
90-
encoder.addTechVia(via4)
91-
encoder.addPoint(bbox.xMin() - 50000, 784490)
92-
encoder.addPoint(319855, 784490)
93-
encoder.addTechVia(via3)
94-
encoder.addPoint(319855, 782490)
95-
encoder.end()
96-
if net.getName() == "pad_raw[61]":
97-
net.clearSpecial()
98-
net.setNonDefaultRule(analog_track)
99-
bbox = term.getBBox()
100-
wire = odb.dbWire.create(net)
101-
encoder = odb.dbWireEncoder()
102-
encoder.begin(wire)
103-
encoder.newPath(metal5, "FIXED", analog_track.getLayerRule(metal5))
104-
encoder.addPoint(bbox.xMin(), bbox.yCenter())
105-
encoder.addPoint(bbox.xMin() - 50000, bbox.yCenter())
106-
encoder.addTechVia(via4)
107-
encoder.addPoint(bbox.xMin() - 50000, 682490)
108-
encoder.addPoint(319855, 682490)
109-
encoder.addTechVia(via3)
110-
encoder.addPoint(319855, 680490)
111-
encoder.end()
46+
name = inst.getMaster().getName()
47+
if not name.startswith("tt_um_"):
48+
continue
49+
user_module = next(filter(lambda m: m.name == name[6:], tti.placer.modules), None)
50+
if not user_module.analog_dedicated:
51+
continue
52+
paths = user_module.analog_dedicated["paths"]
53+
for term in inst.getITerms():
54+
net = term.getNet()
55+
if net.getName() in paths:
56+
net.clearSpecial()
57+
net.setNonDefaultRule(analog_track)
58+
bbox = term.getBBox()
59+
wire = odb.dbWire.create(net)
60+
encoder = odb.dbWireEncoder()
61+
encoder.begin(wire)
62+
encoder.newPath(metal5, "FIXED", analog_track.getLayerRule(metal5))
63+
x = bbox.xMin()
64+
y = bbox.yCenter()
65+
encoder.addPoint(x, y)
66+
for item in paths[net.getName()]:
67+
if "x" in item:
68+
x = item["x"]
69+
encoder.addPoint(x, y)
70+
if "y" in item:
71+
y = item["y"]
72+
encoder.addPoint(x, y)
73+
if "via" in item:
74+
encoder.addTechVia(tech.findVia(item["via"]))
75+
encoder.end()
11276

11377

11478
if __name__ == "__main__":

py/tt/placer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(self, placer, cfg_data):
2929
self.pg_vdd = cfg_data.get('pg_vdd', True)
3030
self.pg_vaa = cfg_data.get('pg_vaa', False)
3131
self.analog = cfg_data.get('analog', {})
32+
self.analog_dedicated = cfg_data.get('analog_dedicated', None)
3233

3334
if self.pg_vdd is True:
3435
self.pg_vdd = 'std' if self.width > 4 else 'll'
@@ -45,6 +46,7 @@ def as_dict(self):
4546
'pg_vdd': self.pg_vdd,
4647
'pg_vaa': self.pg_vaa,
4748
'analog': self.analog,
49+
'analog_dedicated': self.analog_dedicated,
4850
}
4951

5052
@property

rtl/tt_user_module.v.mak

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,8 @@ module tt_user_module #(
7070
% if mod.analog:
7171
.ua (ua),
7272
% endif
73-
% if mod.name == "htfab_r2r_dac":
74-
.ua ({ana[12]}),
75-
% endif
76-
% if mod.name == "algofoogle_antonalog":
77-
.ua ({ana[13], ana[14], ana[15]}),
73+
% if mod.analog_dedicated:
74+
.ua ({${mod.analog_dedicated["pins"]}}),
7875
% endif
7976
.uio_in (uio_in),
8077
.uio_out (uio_out),

0 commit comments

Comments
 (0)