The-OpenROAD-Project / OpenSTA

OpenSTA engine
GNU General Public License v3.0
389 stars 170 forks source link

Add attribute parsing support to OpenSTA #91

Closed QuantamHD closed 4 months ago

QuantamHD commented 2 years ago

I'm working on internal tooling at Google, and are trying to accelerate timing closure with OpenSTA.

TLDR: It would be great if OpenSTA could parse and store verilog attributes on nets and instances, and give users a TCL api to access these key value attributes.

When we run report_checks.

Startpoint: _1521_ (rising edge-triggered flip-flop clocked by clk)
Endpoint: _1518_ (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: max

  Delay    Time   Description
---------------------------------------------------------
   0.00    0.00   clock clk (rise edge)
   0.00    0.00   clock network delay (ideal)
   0.00    0.00 ^ _1521_/CLK (sky130_fd_sc_hd__dfrtp_1)
   0.36    0.36 ^ _1521_/Q (sky130_fd_sc_hd__dfrtp_1)
   0.26    0.62 ^ _1016_/X (sky130_fd_sc_hd__and4_1)
   0.25    0.88 ^ _1018_/X (sky130_fd_sc_hd__and4_1)
   0.13    1.00 v _1021_/Y (sky130_fd_sc_hd__nand4_1)
   0.39    1.40 ^ _1024_/Y (sky130_fd_sc_hd__nor4_1)
   0.19    1.58 v _1027_/Y (sky130_fd_sc_hd__nand4_1)
   0.48    2.07 v _1029_/X (sky130_fd_sc_hd__or4_1)
   0.48    2.55 ^ _1032_/Y (sky130_fd_sc_hd__nor4_1)
   0.22    2.77 v _1034_/Y (sky130_fd_sc_hd__nand4_1)
   0.43    3.20 ^ _1036_/Y (sky130_fd_sc_hd__nor4_1)
   0.20    3.39 v _1039_/Y (sky130_fd_sc_hd__nand4_1)
   0.40    3.79 ^ _1041_/Y (sky130_fd_sc_hd__nor4_1)
   0.31    4.10 ^ _1043_/X (sky130_fd_sc_hd__and4_1)
   0.25    4.35 ^ _1045_/X (sky130_fd_sc_hd__and4_1)
   0.13    4.48 v _1048_/Y (sky130_fd_sc_hd__nand4_1)
   0.39    4.87 ^ _1051_/Y (sky130_fd_sc_hd__nor4_1)
   0.19    5.07 v _1054_/Y (sky130_fd_sc_hd__nand4_1)
   0.42    5.48 ^ _1056_/Y (sky130_fd_sc_hd__nor4_1)
   0.20    5.68 v _1059_/Y (sky130_fd_sc_hd__nand4_1)
   0.34    6.02 ^ _1062_/Y (sky130_fd_sc_hd__nor4_1)
   0.18    6.20 v _1065_/Y (sky130_fd_sc_hd__nand4_1)
   0.42    6.62 ^ _1067_/Y (sky130_fd_sc_hd__nor4_1)
   0.20    6.81 v _1070_/Y (sky130_fd_sc_hd__nand4_1)
   0.46    7.28 ^ _1073_/Y (sky130_fd_sc_hd__nor4_1)
   0.30    7.58 ^ _1075_/X (sky130_fd_sc_hd__and4_1)
   0.11    7.69 v _1078_/Y (sky130_fd_sc_hd__nand4_1)
   0.47    8.16 ^ _1103_/Y (sky130_fd_sc_hd__nor4_1)
   0.22    8.38 v _1106_/Y (sky130_fd_sc_hd__nand4_1)
   0.42    8.80 ^ _1109_/Y (sky130_fd_sc_hd__nor4_1)
   0.19    8.99 v _1112_/Y (sky130_fd_sc_hd__nand4_1)
   0.46    9.45 v _1114_/X (sky130_fd_sc_hd__or4_1)
   0.46    9.92 v _1117_/X (sky130_fd_sc_hd__or4_1)
   0.40   10.32 ^ _1119_/Y (sky130_fd_sc_hd__nor4_1)
   0.19   10.51 v _1122_/Y (sky130_fd_sc_hd__nand4_1)
   0.48   10.99 ^ _1124_/Y (sky130_fd_sc_hd__nor4_1)
   0.21   11.20 v _1127_/Y (sky130_fd_sc_hd__nand4_1)
   0.49   11.69 ^ _1129_/Y (sky130_fd_sc_hd__nor4_1)
   0.23   11.91 v _1132_/Y (sky130_fd_sc_hd__nand4_1)
   0.66   12.57 ^ _1136_/Y (sky130_fd_sc_hd__nor4_1)
   0.20   12.77 v _1138_/Y (sky130_fd_sc_hd__nand4_1)
   0.27   13.04 ^ _1139_/X (sky130_fd_sc_hd__lpflow_isobufsrc_1)
   0.30   13.34 ^ _1224_/X (sky130_fd_sc_hd__and4_1)
   0.10   13.45 v _1225_/Y (sky130_fd_sc_hd__nand3_1)
   0.13   13.57 v _1238_/X (sky130_fd_sc_hd__lpflow_isobufsrc_1)
   0.00   13.57 v _1518_/D (sky130_fd_sc_hd__dfrtp_1)
          13.57   data arrival time

   0.00    0.00   clock clk (rise edge)
   0.00    0.00   clock network delay (ideal)
   0.00    0.00   clock reconvergence pessimism
           0.00 ^ _1518_/CLK (sky130_fd_sc_hd__dfrtp_1)
  -0.13   -0.13   library setup time
          -0.13   data required time
---------------------------------------------------------
          -0.13   data required time
         -13.57   data arrival time
---------------------------------------------------------
         -13.70   slack (VIOLATED)

We get this list of instances. We thought it would be very helpful to use the src attributes generated yosys to put the line numbers next to the instances in the netlist. More generally parsing and storing the attributes in STA and making them available via TCL would be helpful in general.

Example:

/* Generated by Yosys 0.8+ */

(* hdlname = "\\counter" *)
(* top =  1  *)
(* src = "synthesis/tests/counter.v:16.1-32.10" *)
module counter(clk, reset, out);

  (* src = "synthesis/tests/counter.v:26.22-26.37|bazel-out/k8-opt-exec-2B5CBBC6/bin/external/at_clifford_yosys/yosys.runfiles/at_clifford_yosys/techlibs/techmap.v:270.23-270.24" *)
  wire _0247_;
  (* src = "synthesis/tests/counter.v:26.22-26.37|bazel-out/k8-opt-exec-2B5CBBC6/bin/external/at_clifford_yosys/yosys.runfiles/at_clifford_yosys/techlibs/techmap.v:270.26-270.27" *)
  wire _0248_;
  (* src = "synthesis/tests/counter.v:26.22-26.37|bazel-out/k8-opt-exec-2B5CBBC6/bin/external/at_clifford_yosys/yosys.runfiles/at_clifford_yosys/techlibs/techmap.v:270.26-270.27" *)
  wire _0249_;
  (* src = "synthesis/tests/counter.v:26.22-26.37|bazel-out/k8-opt-exec-2B5CBBC6/bin/external/at_clifford_yosys/yosys.runfiles/at_clifford_yosys/techlibs/techmap.v:270.26-270.27" *)
  wire _0250_;
  (* src = "synthesis/tests/counter.v:26.22-26.37|bazel-out/k8-opt-exec-2B5CBBC6/bin/external/at_clifford_yosys/yosys.runfiles/at_clifford_yosys/techlibs/techmap.v:270.26-270.27" *)
  wire _0251_;
...

It would be great if we could include these attributes in the critical path report.

Attached are counter.v and synth_counter.v synthesized with sky130_fd_sc_hd cells. counter.zip

I've also attached the relevant spec to the verilog standard. Verilog Spec Attributes.pdf

maliberty commented 4 months ago

https://github.com/parallaxsw/OpenSTA/pull/11