Skip to content

Commit 140a59d

Browse files
committed
est: fix layer selection for chips with different technologies
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
1 parent efe9f69 commit 140a59d

3 files changed

Lines changed: 27 additions & 3 deletions

File tree

src/est/src/EstimateParasitics.tcl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,17 @@ proc parse_wire_rc_chips { keys_var flags_var selector_var } {
234234
return $target_chips
235235
}
236236

237-
# Layer lookups use the targeted chips' technology when one is selected.
237+
# Layer lookups use the targeted chips' technology when one is selected;
238+
# layers cannot be resolved for chips with different technologies.
238239
proc wire_rc_tech { chips } {
239240
if { [llength $chips] > 0 } {
240241
set tech [[lindex $chips 0] getTech]
242+
foreach chip $chips {
243+
if { [$chip getTech] != $tech } {
244+
utl::error EST 32 "-layer and -layers require chips that share one\
245+
technology; set each chip separately with -chip."
246+
}
247+
}
241248
if { $tech != "NULL" } {
242249
return $tech
243250
}
@@ -491,7 +498,8 @@ proc check_parasitics { } {
491498

492499
proc dblayer_wire_rc { layer } {
493500
set layer_width_dbu [$layer getWidth]
494-
set layer_width_micron [ord::dbu_to_microns $layer_width_dbu]
501+
set dbu_per_micron [[$layer getTech] getDbUnitsPerMicron]
502+
set layer_width_micron [expr { double($layer_width_dbu) / $dbu_per_micron }]
495503
set res_ohm_per_sq [$layer getResistance]
496504
set res_ohm_per_micron [expr $res_ohm_per_sq / $layer_width_micron]
497505
set cap_area_pf_per_sq_micron [$layer getCapacitance]
@@ -509,7 +517,8 @@ proc dblayer_wire_rc { layer } {
509517
proc set_dblayer_wire_rc { layer res cap } {
510518
# Zero the edge cap and just use the user given value
511519
$layer setEdgeCapacitance 0
512-
set wire_width [ord::dbu_to_microns [$layer getWidth]]
520+
set dbu_per_micron [[$layer getTech] getDbUnitsPerMicron]
521+
set wire_width [expr { double([$layer getWidth]) / $dbu_per_micron }]
513522
# Convert wire capacitance/wire_length to capacitance/area (pF/um)
514523
set cap_per_square [expr $cap * 1e+6 / $wire_width]
515524
$layer setCapacitance $cap_per_square

src/est/test/set_wire_rc_chip.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ EST-0028
1111
[WARNING EST-0030] no chip uses technology no_such_tech; values ignored.
1212
[WARNING EST-0031] design has no RDL chip; values ignored.
1313
[INFO ODB-0227] LEF file: Nangate45/Nangate45.lef, created 22 layers, 27 vias
14+
[ERROR EST-0032] -layer and -layers require chips that share one technology; set each chip separately with -chip.
15+
EST-0032
1416
Startpoint: r2 (rising edge-triggered flip-flop clocked by clk)
1517
Endpoint: r3 (rising edge-triggered flip-flop clocked by clk)
1618
Path Group: clk

src/est/test/set_wire_rc_chip.tcl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ set_wire_rc -redistribution_layer -resistance 1e-3 -capacitance 1e-1
2020
# a second tech makes the database multi-tech; tech-targeted values still work
2121
read_lef -tech -tech_name tech2 Nangate45/Nangate45.lef
2222

23+
# a second chip on its own technology: -chip, -tech and RDL selectors succeed
24+
set db [ord::get_db]
25+
odb::dbChip_create $db [$db findTech tech2] "chip2" "RDL"
26+
set_wire_rc -chip chip2 -resistance 1e-3 -capacitance 1e-1
27+
set_wire_rc -tech tech2 -layer metal3
28+
set_wire_rc -redistribution_layer -resistance 2e-3 -capacitance 2e-1
29+
30+
# heterogeneous RDL technologies cannot resolve a shared layer
31+
odb::dbChip_create $db [$db findTech Nangate45] "chip3" "RDL"
32+
set_wire_rc -redistribution_layer -resistance 2e-3 -capacitance 2e-1
33+
catch { set_wire_rc -redistribution_layer -layer metal3 } msg
34+
puts $msg
35+
2336
# same wire RC values as make_parasitics1
2437
set lambda .12
2538
# kohm/square.

0 commit comments

Comments
 (0)