Skip to content

Instantly share code, notes, and snippets.

@daniel-endraws
Last active November 26, 2024 20:32
Show Gist options
  • Save daniel-endraws/17d8086814aad268b74cef3996855b3b to your computer and use it in GitHub Desktop.
Save daniel-endraws/17d8086814aad268b74cef3996855b3b to your computer and use it in GitHub Desktop.
set_cmd_units\
-time ns\
-capacitance pF\
-current mA\
-voltage V\
-resistance kOhm\
-distance um
read_liberty "/home/dendraws/.volare/volare/sky130/versions/0fe599b2afb6708d281543108caf8310912f54af/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
read_verilog runs/drum/50-openroad-fillinsertion/square.nl.v
link_design square
read_spef runs/drum/52-openroad-rcx/nom/square.nom.spef
report_checks -unconstrained -fields {slew cap input nets fanout} -path_delay max
set_cmd_units\
-time ns\
-capacitance pF\
-current mA\
-voltage V\
-resistance kOhm\
-distance um
read_liberty "/home/dendraws/.volare/volare/sky130/versions/0fe599b2afb6708d281543108caf8310912f54af/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
read_verilog runs/drum/06-yosys-synthesis/square.nl.v
link_design square
# set pins [get_pins -of_objects [get_nets *d1_x_in_q[*] ] -filter "direction==input"]
# report_checks -through [get_nets *d1_x_in_q[*]] -unconstrained
report_checks -unconstrained -fields {slew cap input nets fanout} -path_delay max
n k delay_pre_pnr delay_post_pnr std_cell_cnt area power_internal power_switching power_leakage power_total
10 3 2.74 2.77 534 1207.41 1.413710560882464e-05 3.176662721671164e-05 3.155573802260392e-09 4.590688695316203e-05
10 4 2.17 2.60 553 1383.83 2.033684722846374e-05 4.843902206630446e-05 3.280678173567253e-09 6.8779154389631e-05
10 5 5.08 4.95 625 2148.31 0.00012896800762973726 0.0001995161728700623 4.169710354773315e-09 0.00032848832779563963
10 6 4.96 4.53 639 2265.92 0.00010431143164169043 0.0001639211259316653 4.320279689551398e-09 0.0002682368503883481
10 7 6.00 5.86 701 2838.97 0.0005395640037022531 0.0007069063722155988 4.76090544765384e-09 0.0012464751489460468
10 8 5.96 5.35 732 2947.83 0.000477970257634297 0.0007059926283545792 4.975327261291795e-09 0.0011839679209515452
10 9 4.62 4.42 778 3071.7 0.0003583106736186892 0.0005540750571526587 4.801871789084089e-09 0.0009123905329033732
10 10 4.76 4.69 934 4748.3 0.0005460557877086103 0.0007990064914338291 6.538876107242686e-09 0.0013450687984004617
16 6 6.82 5.93 748 3320.68 0.00029735753196291625 0.00040026084752753377 5.686603188337358e-09 0.0006976240547373891
16 7 8.25 7.27 833 4165.24 0.0006229003192856908 0.0008005151175893843 6.407050889833954e-09 0.0014234218979254365
16 8 7.80 6.83 930 4516.83 0.0008102348074316978 0.0010803058976307511 6.664804264033819e-09 0.0018905473407357931
24 6 7.93 7.23 827 4138.97 0.00030967663042247295 0.0005211451789364219 7.104019594805777e-09 0.0008308289106935263
24 7 7.67 7.66 928 5247.53 0.001056209672242403 0.001332187675870955 8.020236919037416e-09 0.0023884051479399204
24 8 8.45 7.91 989 5350.13 0.0008592579397372901 0.0010842389892786741 7.93856624881073e-09 0.0019435049034655094
32 6 7.69 7.18 925 5372.65 0.00032668153289705515 0.0005787513800896704 9.388064547977137e-09 0.0009054422844201326
32 7 10.52 9.43 1039 6312.3 0.0016191414324566722 0.0022836090065538883 9.435511039157518e-09 0.003902760101482272
32 8 10.36 9.28 1156 6766.49 0.0009066107450053096 0.0011804619571194053 9.551590629541806e-09 0.0020870822481811047
import re
import json
from dataclasses import dataclass, fields, asdict
import csv
STA_REGEX = r"\s*([^\s]+)\s*data arrival time"
@dataclass
class Entry:
n: int
k: int
delay_pre_pnr: float
delay_post_pnr: float
std_cell_cnt: int
area: float
power_internal: float
power_switching: float
power_leakage: float
power_total: float
drum_stats = []
full_stats = []
def get_stats(name, n, k):
try:
prefix = f"logs/{name}_{n}_{k}"
with open(f"{prefix}_sta_pre_pnr.log", "r") as f:
delay_pre_pnr = re.search(STA_REGEX, f.read())[1]
with open(f"{prefix}_sta_post_pnr.log", "r") as f:
delay_post_pnr = re.search(STA_REGEX, f.read())[1]
with open(f"{prefix}_final_metrics.json", "r") as f:
data = json.load(f)
entry = Entry(
n, k, delay_pre_pnr, delay_post_pnr,
data["design__instance__count"],
data["design__instance__area"],
data["power__internal__total"],
data["power__switching__total"],
data["power__leakage__total"],
data["power__total"],
)
return entry
except Exception as e:
print(f"Did not find {name} {n} {k}")
for k in range(3, 11):
drum_stats.append(get_stats("drum", 10, k))
for k in range(3, 11):
full_stats.append(get_stats("full", 10, k))
for n in [16, 24, 32]:
for k in [6, 7, 8]:
drum_stats.append(get_stats("drum", n, k))
full_stats.append(get_stats("full", n, n))
for name, stat_list in [("drum_stats", drum_stats), ("full_stats", full_stats)]:
with open(f"{name}.csv", "w") as f:
field_names = [f.name for f in fields(Entry)]
w = csv.DictWriter(f, field_names)
w.writeheader()
w.writerows([asdict(entry) for entry in stat_list])
n k delay_pre_pnr delay_post_pnr std_cell_cnt area power_internal power_switching power_leakage power_total
10 3 0.45 0.62 1020 1363.81 1.756913547978911e-06 4.739042196888477e-06 4.554537191836516e-09 6.500510608020704e-06
10 4 0.41 0.65 1025 1446.39 4.123993221583078e-06 9.658832823333796e-06 4.690924537698038e-09 1.378751767333597e-05
10 5 1.63 1.94 1053 1736.67 2.1853755242773332e-05 4.0922128391684964e-05 5.074255682302464e-09 6.278095679590479e-05
10 6 2.27 2.65 1085 2019.44 4.739794530905783e-05 8.329876436619088e-05 5.247267065300321e-09 0.00013070197019260377
10 7 3.67 3.35 1154 2496.14 7.080696377670392e-05 0.00012740172678604722 5.782021972322582e-09 0.00019821447494905442
10 8 3.54 3.61 1231 3294.41 0.0001834277791203931 0.00027367021539248526 6.8130452390846585e-09 0.00045710481936112046
10 9 3.54 3.76 1288 3696.04 0.0002482568961568177 0.00041396316373720765 7.20645987328794e-09 0.0006622272776439786
10 10 4.34 4.43 1438 4934.73 0.0004132709000259638 0.0006798076792620122 8.313500110546101e-09 0.0010930869029834867
16 16 5.58 5.63 2202 11493.5 0.002633115043863654 0.0038948864676058292 1.5635855277196242e-08 0.006528017111122608
24 24 7.22 7.55 3876 24659.9 0.007803516462445259 0.012044630013406277 2.766299900258673e-08 0.0198481734842062
32 32 7.99 8.57 6217 44554 0.02198158949613571 0.03103804960846901 4.732950031893779e-08 0.0530196875333786
#!/usr/bin/env bash
# cd ~/openlane2
# nix-shell
# cd -
mkdir -p logs
rm -rf logs/*
run_flow () {
name=${1}
n=${2}
k=${3}
set_n ${n}
set_k ${k}
mkdir -p runs/drum
rm -rf runs/drum/*
openlane --condensed --run-tag drum --force-run-dir runs/drum src/config_merged.json
sta -exit -no_splash scripts/delay_synth.tcl > logs/${name}_${n}_${k}_sta_pre_pnr.log
sta -exit -no_splash scripts/delay_rcx.tcl > logs/${name}_${n}_${k}_sta_post_pnr.log
cp runs/drum/06-yosys-synthesis/reports/stat.rpt logs/${name}_${n}_${k}_synth_stat.rpt
cp /home/dendraws/Documents/tt08-donut/runs/drum/final/metrics.json logs/${name}_${n}_${k}_final_metrics.json
}
set_drum () {
sed -i -r -e "s/(parameter IS_DRUM =) (0|1)/\1 ${1}/" src/square.v
}
set_n () {
sed -i -r -e "s/(parameter N =) [0-9]+/\1 ${1}/" src/square.v
}
set_k () {
sed -i -r -e "s/(parameter K =) [0-9]+/\1 ${1}/" src/square.v
}
set_n 10
set_drum 1
for i in {3..10}
do
run_flow drum 10 ${i}
done
set_drum 0
for i in {3..10}
do
run_flow full 10 ${i}
done
set_n 16
set_drum 1
run_flow drum 16 6
run_flow drum 16 7
run_flow drum 16 8
set_drum 0
run_flow full 16 16
set_n 24
set_drum 1
run_flow drum 24 6
run_flow drum 24 7
run_flow drum 24 8
set_drum 0
run_flow full 24 24
set_n 32
set_drum 1
run_flow drum 32 6
run_flow drum 32 7
run_flow drum 32 8
set_drum 0
run_flow full 32 32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment