Skip to content

Commit d80ee8b

Browse files
authored
Merge pull request #2954 from verilog-to-routing/parse_run_dir
[VTR Script] Add Run Number to Parse Script
2 parents 85dfc29 + 5049dcf commit d80ee8b

File tree

4 files changed

+75
-34
lines changed

4 files changed

+75
-34
lines changed

vtr_flow/scripts/python_libs/vtr/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
argparse_use_previous,
1616
argparse_str2bool,
1717
get_existing_run_dir,
18-
get_latest_run_dir,
19-
get_latest_run_number,
18+
get_active_run_dir,
2019
get_next_run_dir,
2120
verify_file,
2221
pretty_print_table,
2322
find_task_dir,
23+
RunDir,
2424
)
2525
from .log_parse import (
2626
determine_lut_size,

vtr_flow/scripts/python_libs/vtr/parse_vtr_task.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from pathlib import Path
88
from pathlib import PurePath
99
import sys
10+
import os
1011
import argparse
1112
import textwrap
1213
import shutil
@@ -18,20 +19,20 @@
1819
from vtr import (
1920
load_list_file,
2021
RawDefaultHelpFormatter,
21-
get_latest_run_dir,
22+
get_active_run_dir,
2223
load_task_config,
2324
find_task_config_file,
2425
load_pass_requirements,
2526
load_parse_results,
2627
parse_vtr_flow,
27-
get_latest_run_number,
2828
pretty_print_table,
2929
find_task_dir,
3030
CommandError,
3131
InspectError,
3232
VtrError,
3333
create_jobs,
3434
paths,
35+
RunDir,
3536
)
3637

3738
# pylint: enable=wrong-import-position
@@ -130,7 +131,12 @@ def vtr_command_argparser(prog=None):
130131
help="QoR geomeans are not computed by default",
131132
)
132133

133-
parser.add_argument("-run", default=None, type=str, help="")
134+
parser.add_argument(
135+
"-run",
136+
default=None,
137+
type=str,
138+
help="Parse the specified run directory. Defaults to the latest.",
139+
)
134140

135141
parser.add_argument("-revision", default="", help="Revision number")
136142

@@ -144,6 +150,8 @@ def vtr_command_main(arg_list, prog=None):
144150
"""
145151
# Load the arguments
146152
args = vtr_command_argparser(prog).parse_args(arg_list)
153+
if args.run is not None:
154+
RunDir.set_user_run_dir_name(args.run)
147155
try:
148156
task_names = args.task
149157

@@ -208,7 +216,7 @@ def parse_task(config, config_jobs, flow_metrics_basename=FIRST_PARSE_FILE, alt_
208216
max_arch_len = len("architecture")
209217
max_circuit_len = len("circuit")
210218
for job in config_jobs:
211-
work_dir = job.work_dir(get_latest_run_dir(find_task_dir(config, alt_tasks_dir)))
219+
work_dir = job.work_dir(get_active_run_dir(find_task_dir(config, alt_tasks_dir)))
212220
job.parse_command()[0] = work_dir
213221
# job.second_parse_command()[0] = work_dir
214222
job.qor_parse_command()[0] = work_dir
@@ -525,7 +533,7 @@ def calc_geomean(args, configs):
525533
first = False
526534
lines = summary.readlines()
527535
print(
528-
get_latest_run_number(find_task_dir(configs[0], args.alt_tasks_dir)),
536+
os.path.basename(get_active_run_dir(find_task_dir(configs[0], args.alt_tasks_dir))),
529537
file=out,
530538
end="\t",
531539
)
@@ -571,7 +579,7 @@ def find_latest_run_dir(config, alt_tasks_dir=None):
571579
"""Find the latest run directory for given configuration"""
572580
task_dir = find_task_dir(config, alt_tasks_dir)
573581

574-
run_dir = get_latest_run_dir(task_dir)
582+
run_dir = get_active_run_dir(task_dir)
575583

576584
if not run_dir:
577585
raise InspectError(

vtr_flow/scripts/python_libs/vtr/task.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
load_list_file,
1717
load_parse_results,
1818
get_existing_run_dir,
19-
get_latest_run_dir,
2019
get_next_run_dir,
20+
get_active_run_dir,
2121
find_task_dir,
2222
load_script_param,
2323
paths,
@@ -585,7 +585,7 @@ def create_jobs(args, configs, after_run=False) -> List[Job]:
585585
work_dir = get_work_dir_addr(arch, circuit, noc_traffic)
586586

587587
run_dir = (
588-
str(Path(get_latest_run_dir(find_task_dir(config, args.alt_tasks_dir))) / work_dir)
588+
str(Path(get_active_run_dir(find_task_dir(config, args.alt_tasks_dir))) / work_dir)
589589
if after_run
590590
else str(
591591
Path(get_next_run_dir(find_task_dir(config, args.alt_tasks_dir))) / work_dir

vtr_flow/scripts/python_libs/vtr/util.py

Lines changed: 57 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,31 @@
2222
from vtr import paths
2323

2424

25+
class RunDir:
26+
"""
27+
A class for representing a run directory.
28+
"""
29+
30+
# The run directory name passed by set_global_run_dir
31+
# is the run directory name to parse.
32+
# If it is None, the latest run directory will be parsed.
33+
g_run_dir_name = None
34+
35+
@classmethod
36+
def set_user_run_dir_name(cls, current_run_dir_name):
37+
"""
38+
Set the run directory name passed by the user.
39+
"""
40+
cls.g_run_dir_name = current_run_dir_name
41+
42+
@classmethod
43+
def get_user_run_dir_name(cls):
44+
"""
45+
Get the run directory name passed by the user.
46+
"""
47+
return cls.g_run_dir_name
48+
49+
2550
class RawDefaultHelpFormatter(
2651
argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter
2752
):
@@ -521,16 +546,18 @@ def find_task_dir(config, alt_tasks_dir=None):
521546
return str(task_dir)
522547

523548

524-
def get_latest_run_dir(base_dir):
549+
def get_active_run_dir(base_dir):
525550
"""
526-
Returns the run directory with the highest run number in base_dir
551+
Returns full path to the active run directory
552+
locatedin base_dir
527553
"""
528-
latest_run_number = get_latest_run_number(base_dir)
554+
active_run_dir_name = get_active_run_dir_name(base_dir)
529555

530-
if latest_run_number is None:
531-
return None
556+
run_dir = None
557+
if active_run_dir_name:
558+
run_dir = str(PurePath(base_dir) / active_run_dir_name)
532559

533-
return str(PurePath(base_dir) / run_dir_name(latest_run_number))
560+
return run_dir
534561

535562

536563
def get_existing_run_dir(base_dir: str, run_dir: str) -> str:
@@ -549,34 +576,40 @@ def get_next_run_number(base_dir):
549576
"""
550577
Returns the next available (i.e. non-existing) run number in base_dir
551578
"""
552-
latest_run_number = get_latest_run_number(base_dir)
553-
554-
if latest_run_number is None:
555-
next_run_number = 1
556-
else:
579+
latest_run_dir_name = get_active_run_dir_name(base_dir)
580+
match = re.match(r"^run(\d{3})$", latest_run_dir_name)
581+
next_run_number = 1
582+
if match:
583+
latest_run_number = int(match.group(1))
557584
next_run_number = latest_run_number + 1
558585

559586
return next_run_number
560587

561588

562-
def get_latest_run_number(base_dir):
589+
def get_active_run_dir_name(base_dir):
563590
"""
564-
Returns the highest run number of all run directories with in base_dir
591+
Returns the active run directory name. If the user has specified
592+
a run directory name, it will be returned. Otherwise, the
593+
highest run number of all run directories within in base_dir
594+
will be returned.
565595
"""
566-
run_number = 1
567-
run_dir = Path(base_dir) / run_dir_name(run_number)
596+
active_run_dir_name = ""
597+
if RunDir.get_user_run_dir_name() is not None:
598+
active_run_dir_name = RunDir.get_user_run_dir_name()
599+
else:
600+
run_number = 1
601+
run_dir = Path(base_dir) / run_dir_name(run_number)
568602

569-
if not run_dir.exists():
570-
# No existing run directories
571-
return None
603+
if run_dir.exists():
604+
while run_dir.exists():
605+
run_number += 1
606+
run_dir = Path(base_dir) / run_dir_name(run_number)
572607

573-
while run_dir.exists():
574-
run_number += 1
575-
run_dir = Path(base_dir) / run_dir_name(run_number)
608+
# Currently one-past the last existing run dir,
609+
# to get latest existing, subtract one
610+
active_run_dir_name = run_dir_name(run_number - 1)
576611

577-
# Currently one-past the last existing run dir,
578-
# to get latest existing, subtract one
579-
return run_number - 1
612+
return active_run_dir_name
580613

581614

582615
def run_dir_name(run_num):

0 commit comments

Comments
 (0)