mirror of https://github.com/openXC7/prjxray.git
074-dump_all: annotate only speed model index
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
This commit is contained in:
parent
194cc230f1
commit
ce35c7c37c
|
|
@ -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\],"
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue