@@ -1918,6 +1918,26 @@ class NetlistWriterVisitor : public NetlistVisitor {
1918
1918
// the maximum setup and hold constraints of all paths. To
1919
1919
// account for the internal delays of the black-box, we add
1920
1920
// port delays equal to the max/min path delays to registers.
1921
+ //
1922
+ // NOTE: Here we are implicitly changing the underlying timing
1923
+ // model from how VTR normally represents the internals of
1924
+ // primitives. In order to properly model the internals of
1925
+ // primitives in the same was as VTR, the timing model must
1926
+ // include internal timing nodes which are explicitly defined
1927
+ // in the model. VTR implicitly creates these nodes, but leaves
1928
+ // them unnamed. This causes issues when trying to use SDF
1929
+ // files to annotate those nodes since the names are not
1930
+ // guaranteed. Here, we simplify the timing model to act
1931
+ // as if it is a single register-file, where all inputs
1932
+ // which have timing arcs through registers have setup/
1933
+ // hold delays and all outputs which have timing arcs
1934
+ // through registers have clock to Q delays. This is
1935
+ // a pessimistic model which is more stable for modeling
1936
+ // purposes.
1937
+ // Ideally we should strive to use the same timing model
1938
+ // as VTR externally; however, we would need to specify
1939
+ // the names of the internal nodes in the architecture
1940
+ // description somehow or come up with a common convention.
1921
1941
1922
1942
// Maintain a mapping from [clock port ID][clock pin ID] -> max setup/hold time of this ipin.
1923
1943
std::unordered_map<AtomPortId, std::unordered_map<AtomPinId, std::pair<double , double >>> ipin_su_hld_time;
@@ -2044,6 +2064,12 @@ class NetlistWriterVisitor : public NetlistVisitor {
2044
2064
// the propagation delay. This tcq would need to be the min / max
2045
2065
// delay across all clocks with timing paths going through this
2046
2066
// output pin.
2067
+ //
2068
+ // NOTE: See the comment in the input ports processing. This
2069
+ // code is implicitly changing the timing model from
2070
+ // VTR's model which pretends that inputs and outputs
2071
+ // act like registers, to a more explicit model where
2072
+ // the entire primitive acts like a register.
2047
2073
2048
2074
// Maintain a mapping from [clock port ID][clock pin ID] -> min/max delay to this opin.
2049
2075
std::unordered_map<AtomPortId, std::unordered_map<AtomPinId, DelayTriple>> opin_total_cq_delays;
0 commit comments