Skip to content

Commit

Permalink
tools: Autotuner: Add --to-stage argument
Browse files Browse the repository at this point in the history
Signed-off-by: Eryk Szpotanski <eszpotanski@antmicro.com>
  • Loading branch information
eszpotanski committed Nov 4, 2024
1 parent 75c72a2 commit 16c0f8a
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
5 changes: 3 additions & 2 deletions tools/AutoTuner/src/autotuner/distributed.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,10 @@ def step(self):
parameters=self.parameters,
flow_variant=self.variant,
install_path=INSTALL_PATH,
stage=args.to_stage,
)
self.step_ += 1
score = self.evaluate(read_metrics(metrics_file))
score = self.evaluate(read_metrics(metrics_file, args.to_stage))
# Feed the score back to Tune.
# return must match 'metric' used in tune.run()
return {METRIC: score}
Expand Down Expand Up @@ -430,7 +431,7 @@ def sweep():
TrainClass = set_training_class(args.eval)
# PPAImprov requires a reference file to compute training scores.
if args.eval == "ppa-improv":
reference = read_metrics(args.reference)
reference = read_metrics(args.reference, args.to_stage)

tune_args = dict(
name=args.experiment,
Expand Down
44 changes: 33 additions & 11 deletions tools/AutoTuner/src/autotuner/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@
set_input_delay [expr $clk_period * $clk_io_pct] -clock $clk_name $non_clock_inputs
set_output_delay [expr $clk_period * $clk_io_pct] -clock $clk_name [all_outputs]
"""
# Maps ORFS stage to a name of produced metrics
STAGE_TO_METRICS = {
"route": "detailedroute",
"place": "detailedplace",
"final": "finish",
}
# Name of the SDC file with constraints
CONSTRAINTS_SDC = "constraint.sdc"
# Name of the TCL script run before routing
Expand Down Expand Up @@ -242,6 +248,7 @@ def openroad(
flow_variant,
path="",
install_path=None,
stage="",
):
"""
Run OpenROAD-flow-scripts with a given set of parameters.
Expand All @@ -265,7 +272,7 @@ def openroad(

make_command = export_command
make_command += f"make -C {base_dir}/flow DESIGN_CONFIG=designs/"
make_command += f"{args.platform}/{args.design}/config.mk"
make_command += f"{args.platform}/{args.design}/config.mk {stage}"
make_command += f" PLATFORM={args.platform}"
make_command += f" FLOW_VARIANT={flow_variant} {parameters}"
make_command += " EQUIVALENCE_CHECK=0"
Expand Down Expand Up @@ -316,10 +323,11 @@ def openroad(
)


def read_metrics(file_name):
def read_metrics(file_name, stage=""):
"""
Collects metrics to evaluate the user-defined objective function.
"""
metric_name = STAGE_TO_METRICS.get(stage if stage else "final", stage)
with open(file_name) as file:
data = json.load(file)
clk_period = 9999999
Expand All @@ -342,17 +350,17 @@ def read_metrics(file_name):
num_drc = value["route__drc_errors"]
if stage_name == "detailedroute" and "route__wirelength" in value:
wirelength = value["route__wirelength"]
if stage_name == "finish" and "timing__setup__ws" in value:
if stage_name == metric_name and "timing__setup__ws" in value:
worst_slack = value["timing__setup__ws"]
if stage_name == "finish" and "power__total" in value:
if stage_name == metric_name and "power__total" in value:
total_power = value["power__total"]
if stage_name == "finish" and "design__instance__utilization" in value:
if stage_name == metric_name and "design__instance__utilization" in value:
final_util = value["design__instance__utilization"]
if stage_name == "finish" and "design__instance__area" in value:
if stage_name == metric_name and "design__instance__area" in value:
design_area = value["design__instance__area"]
if stage_name == "finish" and "design__core__area" in value:
if stage_name == metric_name and "design__core__area" in value:
core_area = value["design__core__area"]
if stage_name == "finish" and "design__die__area" in value:
if stage_name == metric_name and "design__die__area" in value:
die_area = value["design__die__area"]
for i, stage_name in reversed(STAGES):
if stage_name in data and [d for d in data[stage_name].values() if d != "ERR"]:
Expand All @@ -367,9 +375,15 @@ def read_metrics(file_name):
"design_area": design_area,
"core_area": core_area,
"die_area": die_area,
"wirelength": wirelength,
"num_drc": num_drc,
}
"last_successful_stage": last_stage,
} | (
{
"wirelength": wirelength,
"num_drc": num_drc,
}
if metric_name in ("detailedroute", "finish")
else {}
)
return ret


Expand Down Expand Up @@ -678,6 +692,7 @@ def openroad_distributed(
flow_variant=f"{uuid()}-{variant}",
path=path,
install_path=install_path,
stage=args.to_stage,
)
duration = time() - t
return metric_file, duration
Expand Down Expand Up @@ -718,6 +733,13 @@ def add_common_args(parser: argparse.ArgumentParser):
required=True,
help="Configuration file that sets which knobs to use for Autotuning.",
)
parser.add_argument(
"--to-stage",
type=str,
choices=("floorplan", "place", "cts", "route", "finish"),
default="",
help="Run ORFS only to the given stage (inclusive)",
)
parser.add_argument(
"--timeout",
type=float,
Expand Down
2 changes: 1 addition & 1 deletion tools/AutoTuner/src/autotuner/vizier.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def evaluate(args: argparse.Namespace, metric_file: str) -> Dict[str, float]:
Dictionary with metrics
"""
try:
metrics = read_metrics(metric_file)
metrics = read_metrics(metric_file, stage=args.to_stage)
# Calculate difference of clock period and worst slack
if metrics["clk_period"] != 9999999 and metrics["worst_slack"] != "ERR":
metrics["clk_period-worst_slack"] = (
Expand Down

0 comments on commit 16c0f8a

Please sign in to comment.