From a3b8e561943098199f32e04002bbf23d8f144cdc Mon Sep 17 00:00:00 2001 From: Alessandro Comodi Date: Tue, 4 Feb 2020 19:18:41 +0100 Subject: [PATCH] 074-dump_all: added creation of json speed model file for backannotation Signed-off-by: Alessandro Comodi --- fuzzers/074-dump_all/get_speed_model.tcl | 130 ++++++++++++++++++++++ fuzzers/074-dump_all/reduce_tile_types.py | 20 +++- 2 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 fuzzers/074-dump_all/get_speed_model.tcl diff --git a/fuzzers/074-dump_all/get_speed_model.tcl b/fuzzers/074-dump_all/get_speed_model.tcl new file mode 100644 index 00000000..1c042784 --- /dev/null +++ b/fuzzers/074-dump_all/get_speed_model.tcl @@ -0,0 +1,130 @@ +set filename [lindex $argv 0] + +create_project -force -part $::env(XRAY_PART) -name $filename +set_property design_mode PinPlanning [current_fileset] +open_io_design -name io_1 + +set_param messaging.disableStorage 1 +set fp [open $filename r] +set file_data [read $fp] +close $fp + +set fp [open $filename w] + +set indices [split $file_data "\n"] + +set MAGIC 0.6875 + +proc get_speed_model_name {name} { + return [get_speed_models -filter "NAME == $name"] +} + +puts $fp "\{" + + +foreach index $indices { + if {$index == ""} { + continue + } + + set split_index [split $index ","] + set resource [lindex $split_index 0] + set resource_index [lindex $split_index 1] + + puts $fp "\t\"$resource_index\":" + puts $fp "\t\t\{" + + if {$resource == "site_pin"} { + # Getting all site_pin information + set speed_model [get_speed_models -filter "SPEED_INDEX == $resource_index"] + + puts $fp "\t\t\t\"resource_name\": \"$resource\"," + + set driver_speed_model_name [get_property DRIVER $speed_model] + if {$driver_speed_model_name != ""} { + set driver_speed_model [get_speed_model_name [get_property DRIVER $speed_model]] + set RES [expr $MAGIC * [get_property DRIVE $driver_speed_model]] + + puts $fp "\t\t\t\"cap\":\"null\"," + puts $fp "\t\t\t\"res\":\"$RES\"," + + set FAST_MIN [get_property FAST_MIN $driver_speed_model] + set FAST_MAX [get_property FAST_MAX $driver_speed_model] + set SLOW_MIN [get_property SLOW_MIN $driver_speed_model] + set SLOW_MAX [get_property SLOW_MAX $driver_speed_model] + } else { + set CAP [get_property CAP $speed_model] + puts $fp "\t\t\t\"cap\":\"$CAP\"," + puts $fp "\t\t\t\"res\":\"null\"," + + set FAST_MIN [get_property FAST_MIN $speed_model] + set FAST_MAX [get_property FAST_MAX $speed_model] + set SLOW_MIN [get_property SLOW_MIN $speed_model] + set SLOW_MAX [get_property SLOW_MAX $speed_model] + + } + + puts $fp "\t\t\t\"fast_min\":\"$FAST_MIN\"," + puts $fp "\t\t\t\"fast_max\":\"$FAST_MAX\"," + puts $fp "\t\t\t\"slow_min\":\"$SLOW_MIN\"," + puts $fp "\t\t\t\"slow_max\":\"$SLOW_MAX\"" + } elseif {$resource == "pip"} { + # Getting all site_pin information + set speed_model [get_speed_models -filter "SPEED_INDEX == $resource_index"] + + puts $fp "\t\t\t\"resource_name\": \"$resource\"," + + set forward_speed_model [get_speed_model_name [get_property FORWARD $speed_model]] + set reverse_speed_model [get_speed_model_name [get_property REVERSE $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"}] + 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]\"," + } + } elseif {$resource == "wire"} { + # Getting all wire information + set speed_model [get_speed_models -filter "SPEED_INDEX == $resource_index"] + + puts $fp "\t\t\t\"resource_name\": \"$resource\"," + puts $fp "\t\t\t\"res\":\"[get_property WIRE_RES $speed_model]\"," + puts $fp "\t\t\t\"cap\":\"[get_property WIRE_CAP $speed_model]\"," + } else { + puts "STUFF TO READ $index $resource" + exit 2 + } + + puts $fp "\t\t\}," +} + +puts $fp "\}" + +close $fp diff --git a/fuzzers/074-dump_all/reduce_tile_types.py b/fuzzers/074-dump_all/reduce_tile_types.py index dc643356..379879ba 100644 --- a/fuzzers/074-dump_all/reduce_tile_types.py +++ b/fuzzers/074-dump_all/reduce_tile_types.py @@ -11,6 +11,7 @@ import argparse import prjxray.lib import prjxray.node_lookup import datetime +import subprocess import os.path import pyjson5 as json5 import progressbar @@ -242,18 +243,18 @@ def get_speed_model_indices(reduced_tile): 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']) + speed_model_indices.add('site_pin,{}'.format(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']) + speed_model_indices.add('pip,{}'.format(reduced_tile['pips'][pip]['speed_model_index'])) for wire in reduced_tile['wires'].keys(): - speed_model_indices.add(reduced_tile['wires'][wire]) + speed_model_indices.add('wire,{}'.format(reduced_tile['wires'][wire])) return speed_model_indices -def annotate_speed_model(tile_type, reduced_tile, output_dir): +def annotate_speed_model(tile_type, reduced_tile, output_dir, root_dir): """ Updates the reduced tile with the correct speed information """ speed_model_indices = get_speed_model_indices(reduced_tile) @@ -264,6 +265,15 @@ def annotate_speed_model(tile_type, reduced_tile, output_dir): for index in speed_model_indices: print(index, file=f) + subprocess.check_call( + "vivado -mode batch -source get_speed_model.tcl -tclargs {}".format(tmp_indices_file), + shell=True, stdout=subprocess.DEVNULL) + + with open(tmp_indices_file, "r") as f: + speed_model_data = json5.load(f) + + with open(tmp_indices_file, "w") as f: + xjson.pprint(f, speed_model_data) def reduce_tile(pool, site_types, tile_type, tile_instances, database_file): sites = None @@ -369,7 +379,7 @@ def main(): reduced_tile = reduce_tile( pool, site_types, tile_type, tiles[tile_type], database_file) - annotate_speed_model(tile_type, reduced_tile, args.output_dir) + annotate_speed_model(tile_type, reduced_tile, args.output_dir, args.root_dir) for site_type in site_types: with open(os.path.join(