074-dump_all: added creation of json speed model file for backannotation

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
This commit is contained in:
Alessandro Comodi 2020-02-04 19:18:41 +01:00 committed by Keith Rothman
parent ce35c7c37c
commit a3b8e56194
2 changed files with 145 additions and 5 deletions

View File

@ -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

View File

@ -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(