diff --git a/fuzzers/074-dump_all/jobtiles.tcl b/fuzzers/074-dump_all/jobtiles.tcl index d4468a2e..d854f979 100644 --- a/fuzzers/074-dump_all/jobtiles.tcl +++ b/fuzzers/074-dump_all/jobtiles.tcl @@ -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\]," diff --git a/fuzzers/074-dump_all/reduce_tile_types.py b/fuzzers/074-dump_all/reduce_tile_types.py index f8aaec4d..dc643356 100644 --- a/fuzzers/074-dump_all/reduce_tile_types.py +++ b/fuzzers/074-dump_all/reduce_tile_types.py @@ -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(