diff --git a/src/dvsim/flow/base.py b/src/dvsim/flow/base.py index 619526d5..a54bed3d 100644 --- a/src/dvsim/flow/base.py +++ b/src/dvsim/flow/base.py @@ -4,6 +4,7 @@ """Flow config base class.""" +import json import os import pprint import sys @@ -411,6 +412,19 @@ def deploy_objects(self) -> Mapping[Deploy, str]: log.error("Nothing to run!") sys.exit(1) + if os.environ.get("DVSIM_DEPLOY_DUMP", "true"): + filename = f"deploy_{self.branch}_{self.timestamp}.json" + (Path(self.scratch_root) / filename).write_text( + json.dumps( + # Sort on full name to ensure consistent ordering + sorted( + [d.model_dump() for d in deploy], + key=lambda d: d["full_name"], + ), + indent=2, + ), + ) + return Scheduler( items=deploy, launcher_cls=get_launcher_cls(), diff --git a/src/dvsim/job/deploy.py b/src/dvsim/job/deploy.py index cebd66be..1a744494 100644 --- a/src/dvsim/job/deploy.py +++ b/src/dvsim/job/deploy.py @@ -334,6 +334,27 @@ def create_launcher(self) -> None: # Retain the handle to self for lookup & callbacks. self.launcher = get_launcher(self) + def model_dump(self) -> Mapping: + """Dump the deployment object to mapping object. + + This method matches the interface provided by pydantic models to dump a + subset of the class attributes + + Returns: + Representation of a deployment object as a dict. + + """ + return { + "full_name": self.full_name, + "type": self.__class__.__name__, + "exports": self.exports, + "interactive": self.sim_cfg.interactive, + "log_path": self.get_log_path(), + "timeout_mins": self.get_timeout_mins(), + "cmd": self.cmd, + "gui": self.gui, + } + class CompileSim(Deploy): """Abstraction for building the simulation executable.""" diff --git a/src/dvsim/launcher/local.py b/src/dvsim/launcher/local.py index 8f9bec9f..eecc3ce6 100644 --- a/src/dvsim/launcher/local.py +++ b/src/dvsim/launcher/local.py @@ -9,9 +9,13 @@ import shlex import subprocess from pathlib import Path +from typing import TYPE_CHECKING from dvsim.launcher.base import ErrorMessage, Launcher, LauncherBusyError, LauncherError +if TYPE_CHECKING: + from dvsim.job.deploy import Deploy + class LocalLauncher(Launcher): """Implementation of Launcher to launch jobs in the user's local workstation.""" @@ -19,7 +23,7 @@ class LocalLauncher(Launcher): # Poll job's completion status every this many seconds poll_freq = 0.025 - def __init__(self, deploy) -> None: + def __init__(self, deploy: "Deploy") -> None: """Initialize common class members.""" super().__init__(deploy)