-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathutils.py
More file actions
64 lines (56 loc) · 2.14 KB
/
utils.py
File metadata and controls
64 lines (56 loc) · 2.14 KB
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
55
56
57
58
59
60
61
62
63
64
import os
import json
from scipy.special import comb
def cal_atk(dic_list, n, k):
#syntax
sum_list = []
for design in dic_list.keys():
c = dic_list[design]['syntax_success']
sum_list.append(1 - comb(n - c, k) / comb(n, k))
#sum_list.append(0)
syntax_passk = sum(sum_list) / len(sum_list)
#func
sum_list = []
for design in dic_list.keys():
c = dic_list[design]['func_success']
sum_list.append(1 - comb(n - c, k) / comb(n, k))
#sum_list.append(0)
func_passk = sum(sum_list) / len(sum_list)
print(f'syntax pass@{k}: {syntax_passk}, func pass@{k}: {func_passk}')
def jsonline_iter(file_path: str):
with open(file_path, "r") as f:
for line in f:
yield json.loads(line)
def example_to_jsonline(examples: dict, save_file: str):
with open(save_file, "a") as f:
f.write(json.dumps(examples) + "\n")
def parse_code(raw_code: str):
# extract code from the answer:
if "```verilog\n" in raw_code and "```" in raw_code:
code = raw_code.split("```verilog\n")[1].split("```")[0]
elif "```verilog\n" in raw_code and not "```" in raw_code:
code = raw_code.split("```verilog\n")[1]
elif "```" in raw_code and not "```verilog\n" in raw_code:
code = raw_code.split("```")[1]
elif not "```verilog\n" in raw_code:
code = raw_code
s_full = code
s = s_full.rsplit('endmodule', 1)[0] + "\n" + "endmodule"
index = s.find('endmodule')
if index != -1:
s = s[:index] + "endmodule"
return s.lstrip(' \n')
def build_verilog_file(input_jsonl, output_dir):
num_of_each_task = {}
for item in jsonline_iter(input_jsonl):
task_id = item["task_id"]
code = item["res"]
if task_id not in num_of_each_task:
num_of_each_task[task_id] = 1
else:
num_of_each_task[task_id] += 1
os.makedirs(f"{output_dir}/test_{num_of_each_task[task_id]}", exist_ok=True)
with open(f"{output_dir}/test_{num_of_each_task[task_id]}/{task_id}.v", "w") as f:
f.write(code)
if __name__ == "__main__":
build_verilog_file("example.jsonl", "output_dir")