( ESNUG 450 Item 7 ) --------------------------------------------- [01/25/06]
From: Tom Arneberg <toma=usr domain=sgi hot mom>
Subject: An Easier Way I can report Global Net Worst Delays in PrimeTime?
Hi, John,
I'm trying to figure out the best way to get the worst delay from one pin
to another in PrimeTime. This is to determine the delay of a global net,
before floorplan blocks are even synthesized. The path is simple; non-
inverting, fanouts of one, with zero or more repeater buffers (or pairs
of inverters):
zero or more repeaters
__________________
/ \
|\ |\ |\ |\
...-----| >*-------| >----...----| >--------*| >---...
|/pin1 |/ |/ pin2|/
How can I get the delay from pin1 to pin2? I can't simply get a timing arc,
because there are an unknown number of optional repeater buffers between the
two pins, and a timing arc only goes across one net or cell. (Also, I need
to traverse the hierarchy of soft macros.)
In my past experience with other tools (IBM Einstimer), it took only one
command to get the latest arrival times of pin1 and pin2, and then I could
just subtract them. (I took the worst of the rise-to-rise or fall-to-fall
delays.)
However, in my admittedly fragile understanding of PrimeTime, I don't think
I can access arrival time information for a pin.
I have done a lot of interactive experimenting, and I think I can get the
arrival time of a pin by getting all the timing paths through that pin, then
getting all the timing points on those paths, then for each timing point,
get the pin object, compare the full_name of that pin object to the full_name
of the pin object that I want to find the time for, and if they're equal,
then get the "arrival" attribute of that timing point. (Phew!)
Here's some quick code that will do this:
proc ta::get_pin_arrtime { pinarg_obj } {
set tpaths [ get_timing_paths -through $pinarg_obj ]
puts "num.tpaths = [ sizeof_collection $tpaths ]"
set tpoints [ get_attribute $tpaths points ]
puts "num.tpoints = [ sizeof_collection $tpoints ]"
foreach_in_collection tpoint $tpoints {
set tpin [ get_attribute $tpoint object ]
set edge [ get_attribute $tpoint rise_fall ]
set tpin_name [ get_object_name $tpin ]
set pinarg_name [ get_object_name $pinarg_obj ]
if { $tpin_name == $pinarg_name } {
set arrtime [ get_attribute $tpoint arrival ]
puts " arrtime for $tpin_name is $arrtime ($edge)"
# return $arrtime
}
}
}
pt_shell> ta::get_pin_arrtime [get_pins lb_pio/U6308/A]
num.tpaths = 1
num.tpoints = 11
arrtime for lb_pio/U6308/A is 2.462952 (rise)
I guess this basically works... but here are my questions:
(1) Is there a better way to compare two objects, other than to get the
full_name of each and compare those strings?
(2) Why is there only one "arrival" time, and not one for rise and one for
fall? I want to get the worst delay from pin1 to pin2, so I thought
I'd have to do one rise and one fall and take the max delay. (I
thought there'd be two timing paths -- one for rise, one for fall.)
(3) IS THERE A BETTER WAY TO DO THIS?! This seems really complex to do
all that simply to get the arrival time of each pin, and then subtract
them. What I really need is a command to get a timing arc that spans
multiple cells. I'm sure others have needed to measure the delay of a
snippet of a simple path -- how have they done it?
Thanks for any advice, from a PrimeTime newbie.
- Tom Arneberg
SGI Chippewa Falls, WI
Index
Next->Item
|
|