###########################################################################
#proc to trace back from input to driver through buffers/inverters
proc trace_back_bufinv { pin } {
set i 0;
set not_buf false;
set not_inv false;
while {1} {
set out [filter_collection [all_connected [get_flat_nets -of $pin] -leaf] "direction==out"]
if {[sizeof_collection $out] == 0} { set out [filter_collection [all_connected [get_flat_nets -of $pin] -leaf] "object_class==port"]}
set cc [get_flat_cells -of $out -quiet]
if {[sizeof_collection $cc] == 0 } { set cc [get_attribute $out design] }
if {[get_object_name $cc] == [get_attribute [get_designs] top_module_name]} {
set ref [get_attr [get_designs] top_module_name] } else { set ref [get_attr $cc ref_name] }
if {[regexp {_buf} $ref]} { set not_buf false; } else { set not_buf true}
if {[regexp {_inv} $ref]} { set not_inv false; } else { set not_inv true}
set pin [get_flat_pins -of $cc -filter "direction==in"]
incr i;
if {$not_inv && $not_buf} { return [get_object_name $out]; break }
}
}
#proc to trace front from output to loads through buffers/inverters
proc trace_front_bufinv { pin } {
redirect -variable testfront {report_buffer_trees -from $pin -hierarchy}
set sink {}
foreach line [split $testfront "\n"] {
if {[regexp -nocase {Load } $line]} { lappend sink [lindex $line end-1] }
}
return $sink;
}
#----------------------------------------------------------------------------------------------------------------------------------
set mod_cells [get_flat_cells -of ${module_cell} ]
set mod_cells_pins [get_flat_pins -of ${mod_cells} -filter "port_type==signal && name!=ret && name!=nret"]
foreach_in_collection mcc $mod_cells_pins {
incr i;
set direction [get_attribute $mcc direction]
if {$direction=="in"} {
set drivers [prd_trace_back_bufinv $mcc]
set drivers [get_flat_pins $drivers -quiet]
set drivers [add_to_collection -unique $drivers [get_ports $drivers -quiet]]
set loads $mcc
} else {
set drivers $mcc
set loads [prd_trace_front_bufinv $mcc]
set loads [get_flat_pins $loads -quiet]
set loads [add_to_collection -unique $loads [get_ports $loads -quiet]]
}
}
###########################################################################