You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.6 KiB

#!/usr/bin/env python3
#
# (c) 2019-2026 Antmicro <www.antmicro.com>
# License: Apache-2.0
#
import os
import subprocess
import sys
import re
import platform
import time
# Increase major number for general changes, middle number for smaller changes
# that can cause incompatibilities and minor number for regular fixes
SARGRAPH_VERSION = "2.5.0"
# Define units for use with unit_str
TIME_UNITS = ['seconds', 'minutes', 'hours']
DATA_UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB']
SPEED_UNITS = ['Mb/s', 'Gb/s', 'Tb/s', 'Pb/s']
# Print an error message and exit with non-zero status
def fail(msg):
print(f"Error: {msg}", file=sys.stderr)
sys.exit(1)
# Run process, return subprocess object on success, exit script on failure
def run_or_fail(*argv, **kwargs):
try:
p = subprocess.Popen(argv, **kwargs)
except:
fail(f"'{argv[0]}' tool not found")
return p
# Check if a process is running
def pid_running(pid):
return file_exists(f"/proc/{pid}")
# Check whether path exists
def file_exists(filename: str):
return os.path.exists(filename)
# Spin and wait until function succeeds
def spinloop(f, wait: float, tries: int):
for _ in range(tries):
if f():
return True
time.sleep(wait)
return False
# Convert a string to float, also when the separator is a comma
def stof(s):
return float(s.replace(',', '.'))
# Return a string without given suffix or unchange if it doesn't have it
def cut_suffix(s, sfx):
if s.endswith(sfx):
s = s[:-len(sfx)]
return s
# Scale a value until it has a convenient size and unit, round the value
# and return a string representation with the new value and its unit
def unit_str(value, units, step=1024):
value = float(value)
biggest = len(units) - 1
unit = 0
while value >= step and unit < biggest:
value /= step
unit += 1
return f"{round(value, 2)} {units[unit]}"
# Get the first group from a given match and convert to required type
def scan(regex, conv, string):
match = re.search(regex, string)
if not match:
return None
try:
value = conv(match.group(1))
except ValueError:
return None
return value
# Return True iff version string `a` is greater than or equal to `b`
def is_version_ge(a, b):
a = [int(n) for n in a.split('.')]
b = [int(n) for n in b.split('.')]
if len(a) != len(b):
return len(a) > len(b)
for i, _ in enumerate(a):
if a[i] != b[i]:
break
return a[i] >= b[i]
def is_darwin():
return platform.system() == 'Darwin'
def is_windows():
return platform.system() == 'Windows'