074-dump_all: annotate only speed model index

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
This commit is contained in:
Alessandro Comodi 2020-02-04 14:49:04 +01:00 committed by Keith Rothman
parent 194cc230f1
commit ce35c7c37c
2 changed files with 47 additions and 103 deletions

View File

@ -27,26 +27,6 @@ set not_allowed_tiles [get_tiles -of_objects $not_allowed_sites]
set MAGIC 0.6875
set speed_model_index_map [dict create]
set speed_model_name_map [dict create]
proc lookup_speed_model_index {index} {
upvar speed_model_index_map speed_model_index_map
if { ![dict exists $speed_model_index_map $index] } {
set model [get_speed_models -filter "SPEED_INDEX == $index"]
dict set speed_model_index_map $index $model
}
return [dict get $speed_model_index_map $index]
}
proc lookup_speed_model_name {name} {
upvar speed_model_name_map speed_model_name_map
if { ![dict exists $speed_model_name_map $name] } {
set model [get_speed_models -filter "NAME == $name"]
dict set speed_model_name_map $name $model
}
return [dict get $speed_model_name_map $name]
}
# For BSW_INT_LONG_MUX, use the model from BSW_INT_HLONG_MUX.
# This isn't exactly correct, but it is a better model to use.
@ -112,22 +92,11 @@ for {set j $start } { $j < $stop } { incr j } {
# SPEED_INDEX
puts $fp "\t\t\t\{"
puts $fp "\t\t\t\t\"site_pin\":\"$site_pin\","
set site_pin_speed_model [lookup_speed_model_index [get_property SPEED_INDEX $site_pin]]
set site_pin_speed_model_index [get_property SPEED_INDEX $site_pin]
puts $fp "\t\t\t\t\"speed_model_index\":\"$site_pin_speed_model_index\","
set dir [get_property DIRECTION $site_pin]
if { $dir == "IN" } {
puts $fp "\t\t\t\t\"cap\": \"[get_property CAP $site_pin_speed_model]\","
} else {
set site_pin_speed_model [lookup_speed_model_name [get_property DRIVER $site_pin_speed_model]]
puts $fp "\t\t\t\t\"res\": \"[expr $MAGIC * [get_property DRIVE $site_pin_speed_model]]\","
}
puts $fp "\t\t\t\t\"delay\": \["
puts $fp "\t\t\t\t\t\"[get_property FAST_MIN $site_pin_speed_model]\","
puts $fp "\t\t\t\t\t\"[get_property FAST_MAX $site_pin_speed_model]\","
puts $fp "\t\t\t\t\t\"[get_property SLOW_MIN $site_pin_speed_model]\","
puts $fp "\t\t\t\t\t\"[get_property SLOW_MAX $site_pin_speed_model]\","
puts $fp "\t\t\t\t\],"
puts $fp "\t\t\t\t\"direction\":\"$dir\","
set site_pin_node [get_nodes -of_objects $site_pin]
if {[llength $site_pin_node] == 0} {
@ -169,45 +138,9 @@ for {set j $start } { $j < $stop } { incr j } {
# IS_TEST_PIP NAME SPEED_INDEX TILE
puts $fp "\t\t\{"
puts $fp "\t\t\t\"pip\":\"$pip\","
set pip_speed_model [lookup_speed_model_index [get_property SPEED_INDEX $pip]]
set forward_speed_model [lookup_speed_model_name [get_property FORWARD $pip_speed_model]]
set reverse_speed_model [lookup_speed_model_name [get_property REVERSE $pip_speed_model]]
set forward_speed_model_type [get_property TYPE $forward_speed_model]
set reverse_speed_model_type [get_property TYPE $reverse_speed_model]
set is_pass_transistor [expr {"$forward_speed_model_type" == "pass_transistor"}]
puts $fp "\t\t\t\"is_pass_transistor\":$is_pass_transistor,"
if { !$is_pass_transistor } {
puts $fp "\t\t\t\"forward_delay\":\["
puts $fp "\t\t\t\t\"[get_property FAST_MIN $forward_speed_model]\","
puts $fp "\t\t\t\t\"[get_property FAST_MAX $forward_speed_model]\","
puts $fp "\t\t\t\t\"[get_property SLOW_MIN $forward_speed_model]\","
puts $fp "\t\t\t\t\"[get_property SLOW_MAX $forward_speed_model]\","
puts $fp "\t\t\t\],"
if {$forward_speed_model_type == "buffer_switch" || $forward_speed_model_type == "buffer"} {
puts $fp "\t\t\t\"forward_res\": \"[expr $MAGIC * [get_property DRIVE $forward_speed_model]]\","
}
if {$forward_speed_model_type == "buffer_switch"} {
puts $fp "\t\t\t\"forward_in_cap\": \"[get_property IN_CAP $forward_speed_model]\","
}
puts $fp "\t\t\t\"reverse_delay\":\["
puts $fp "\t\t\t\t\"[get_property FAST_MIN $reverse_speed_model]\","
puts $fp "\t\t\t\t\"[get_property FAST_MAX $reverse_speed_model]\","
puts $fp "\t\t\t\t\"[get_property SLOW_MIN $reverse_speed_model]\","
puts $fp "\t\t\t\t\"[get_property SLOW_MAX $reverse_speed_model]\","
puts $fp "\t\t\t\],"
if {$reverse_speed_model_type == "buffer_switch" || $reverse_speed_model_type == "buffer"} {
puts $fp "\t\t\t\"reverse_res\": \"[expr $MAGIC * [get_property DRIVE $reverse_speed_model]]\","
}
if {$reverse_speed_model_type == "buffer_switch"} {
puts $fp "\t\t\t\"reverse_in_cap\": \"[get_property IN_CAP $reverse_speed_model]\","
}
} else {
puts $fp "\t\t\t\"forward_res\": \"[get_property RES $forward_speed_model]\","
puts $fp "\t\t\t\"reverse_res\": \"[get_property RES $reverse_speed_model]\","
}
set pip_speed_model_index [get_property SPEED_INDEX $pip]
puts $fp "\t\t\t\"speed_model_index\":\"$pip_speed_model_index\","
puts $fp "\t\t\t\"src_wire\":\"[get_wires -uphill -of_objects $pip]\","
puts $fp "\t\t\t\"dst_wire\":\"[get_wires -downhill -of_objects $pip]\","
puts $fp "\t\t\t\"is_pseudo\":\"[get_property IS_PSEUDO $pip]\","
@ -224,10 +157,10 @@ for {set j $start } { $j < $stop } { incr j } {
# IS_PART_OF_BUS NAME NUM_DOWNHILL_PIPS NUM_INTERSECTS NUM_PIPS
# NUM_TILE_PORTS NUM_UPHILL_PIPS SPEED_INDEX TILE_NAME TILE_PATTERN_OFFSET
puts $fp "\t\t\{"
set wire_speed_model [lookup_speed_model_index [get_property SPEED_INDEX $wire]]
puts $fp "\t\t\t\"wire\":\"$wire\","
puts $fp "\t\t\t\"res\":\"[get_property WIRE_RES $wire_speed_model]\","
puts $fp "\t\t\t\"cap\":\"[get_property WIRE_CAP $wire_speed_model]\","
set wire_speed_model_index [get_property SPEED_INDEX $wire]
puts $fp "\t\t\t\t\"speed_model_index\":\"$wire_speed_model_index\","
puts $fp "\t\t\},"
}
puts $fp "\t\],"

View File

@ -41,15 +41,9 @@ def flatten_site_pins(tile, site, site_pins, site_pin_node_to_wires):
pin_info = {
'wire': wires[0],
'delay': site_pin['delay'],
'speed_model_index': site_pin['speed_model_index'],
}
if 'cap' in site_pin:
pin_info['cap'] = site_pin['cap']
if 'res' in site_pin:
pin_info['res'] = site_pin['res']
yield (
check_and_strip_prefix(site_pin['site_pin'], site + '/'),
pin_info)
@ -114,18 +108,8 @@ def get_pips(tile, pips):
pip['is_directional'],
'can_invert':
pip['can_invert'],
'is_pass_transistor':
pip['is_pass_transistor'],
'src_to_dst': {
'delay': pip.get('forward_delay', None),
'in_cap': pip.get('forward_in_cap', None),
'res': pip.get('forward_res', None),
},
'dst_to_src': {
'delay': pip.get('reverse_delay', None),
'in_cap': pip.get('reverse_in_cap', None),
'res': pip.get('reverse_res', None),
},
'speed_model_index':
pip['speed_model_index'],
}
return proto_pips
@ -231,15 +215,9 @@ def read_json5(fname, database_file):
for wire in tile['wires']:
assert wire['wire'].startswith(tile['tile'] + '/')
if wire['res'] != '0.000' or wire['cap'] != '0.000':
wire_delay_model = {
'res': wire['res'],
'cap': wire['cap'],
}
else:
wire_delay_model = None
wire_speed_model_index = wire['speed_model_index']
yield wire['wire'][len(tile['tile']) + 1:], wire_delay_model
yield wire['wire'][len(tile['tile']) + 1:], wire_speed_model_index
wires = {k: v for (k, v) in inner()}
wires_from_nodes = set(node_lookup.wires_for_tile(tile['tile']))
@ -257,6 +235,36 @@ def compare_and_update_wires(wires, new_wires):
assert wires[wire] == new_wires[wire]
def get_speed_model_indices(reduced_tile):
""" Extracts the speed model indices for the data structure """
speed_model_indices = set()
for site in reduced_tile['sites']:
for site_pin in site['site_pins'].keys():
speed_model_indices.add(site['site_pins'][site_pin]['speed_model_index'])
for pip in reduced_tile['pips'].keys():
speed_model_indices.add(reduced_tile['pips'][pip]['speed_model_index'])
for wire in reduced_tile['wires'].keys():
speed_model_indices.add(reduced_tile['wires'][wire])
return speed_model_indices
def annotate_speed_model(tile_type, reduced_tile, output_dir):
""" Updates the reduced tile with the correct speed information """
speed_model_indices = get_speed_model_indices(reduced_tile)
tmp_indices_file = os.path.join(output_dir, '{}_speed_index.tmp'.format(tile_type))
with open(tmp_indices_file, "w") as f:
for index in speed_model_indices:
print(index, file=f)
def reduce_tile(pool, site_types, tile_type, tile_instances, database_file):
sites = None
pips = None
@ -360,6 +368,9 @@ def main():
datetime.datetime.now(), tile_type))
reduced_tile = reduce_tile(
pool, site_types, tile_type, tiles[tile_type], database_file)
annotate_speed_model(tile_type, reduced_tile, args.output_dir)
for site_type in site_types:
with open(os.path.join(
args.output_dir, 'tile_type_{}_site_type_{}.json'.format(