-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.py
54 lines (40 loc) · 1.62 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import re
# This is a naive way of extracting code, but should work for our purposes
def extract_code_block(str):
code = re.search(r".*(module\s.+endmodule).*", str, flags=re.DOTALL)
return None if code == None else code.group(1).strip()
def extract_normalized_verilog_code(str, expected_module_name):
"""
This makes sure that the extracted code block has the expected module name
"""
code = extract_code_block(str)
if code == None:
return
mod_name = get_module_name(code)
if mod_name == None:
return
if mod_name == expected_module_name:
return code
return rename_module(code, expected_module_name, mod_name)
def read_file(file):
with open(file) as f:
return f.read()
def write_file(file, contents):
with open(file, "w") as f:
f.write(contents)
def rename_module(code: str, new_name: str, old_name: str = "fsm") -> str:
"""By default, bosy names the generated verilog module "fsm". This module provides the option to rename the module"""
matches = re.search(
pattern=r"(.*module\s+)(" + old_name + r")(?:\s*#.*?\))?(\s*\(.*)",
string=code,
flags=re.DOTALL,
)
return code if matches == None else matches.group(1) + new_name + matches.group(3)
def get_module_name(code: str) -> str:
"""Searches for the module name in verilog code"""
matches = re.search(
pattern=r".*module\s+(\w+)(?:\s*#.*?\))?\s*\(.*", string=code, flags=re.DOTALL
)
return None if matches == None else matches.group(1)
def join_params(params: dict):
return " and ".join([k + "=" + str(v) for (k, v) in params.items()])