diff --git a/src/rtlmeter/context.py b/src/rtlmeter/context.py index 7c2f55c..5cedfe1 100644 --- a/src/rtlmeter/context.py +++ b/src/rtlmeter/context.py @@ -14,6 +14,7 @@ # # SPDX-License-Identifier: Apache-2.0 +import multiprocessing import os import time from functools import cached_property @@ -77,10 +78,12 @@ def availableCases(self) -> List[str]: value.append(f"{designName}:{configName}:{testName}") return sorted(value) - # CPUs usable by this process + # Number of logical processors usable by this process @cached_property - def usableCpus(self) -> List[int]: - return sorted(_ for _ in os.sched_getaffinity(0)) + def nProc(self) -> int: + if hasattr(os, "sched_getaffinity"): + return len(os.sched_getaffinity(0)) + return multiprocessing.cpu_count() # Set deadline to now + 'timeout' minutes def setTimeout(self, timeout: Optional[int]) -> None: diff --git a/src/rtlmeter/runcmd.py b/src/rtlmeter/runcmd.py index 8677da2..b3cdb7b 100644 --- a/src/rtlmeter/runcmd.py +++ b/src/rtlmeter/runcmd.py @@ -19,6 +19,7 @@ import shlex import stat import subprocess +import sys import time from typing import Dict, Final, List @@ -34,6 +35,11 @@ """ +TIME_CMD = "time" +if sys.platform == "darwin": + TIME_CMD = "gtime" # On macOS use GNU time + + def runcmd( cmd: List[str], # Command + arguments tag: str, # Tag string to use for log and marker files @@ -67,7 +73,7 @@ def runcmd( # Actual command line to run, using the cmd file timeFile = os.path.join(tagDir, "time.json") - cmd = ["time", "-o", timeFile, "-f", _TIMEFORMAT, cmdFileName] + cmd = [TIME_CMD, "-o", timeFile, "-f", _TIMEFORMAT, cmdFileName] # Apply timeout if a deadline is set if (timeout := CTX.timeout()) is not None: diff --git a/src/rtlmeter/verilator.py b/src/rtlmeter/verilator.py index 22bd895..26e7646 100644 --- a/src/rtlmeter/verilator.py +++ b/src/rtlmeter/verilator.py @@ -103,7 +103,7 @@ def job() -> bool: cmd = [ "make", "-j", - str(len(CTX.usableCpus)), + str(CTX.nProc), "-C", "obj_dir", "-f",