-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtechbase.py
103 lines (95 loc) · 3.51 KB
/
techbase.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import pprint
import logging
from pathlib import Path
from schema import Schema
from pallette import HashPallette
import hashlib
class TechBase():
def __init__(self, args):
self.stats = {
'fill' : 0,
'antenna' : 0,
'tap' : 0,
'ff' : 0,
'logic' : 0,
'other' : 0,
}
self.stats_count = {
'fill' : 0,
'antenna' : 0,
'tap' : 0,
'ff' : 0,
'logic' : 0,
'other' : 0,
}
self.tech_name = args.tech
self.redact = args.redact
self.tech = Schema('tech' / Path(self.tech_name))
if not self.tech.read() or args.regenerate_lef:
logging.info("Can't read db.json in tech directory; generating it automatically.")
self.tech.scan()
self.tech.overwrite()
self.pallette = HashPallette(self)
def hue_ranges(self):
return self.hue_lut
def sat_ranges(self):
return self.sat_lut
def gather_stats(self, design):
for cell, data in design.schema['cells'].items():
if 'FILLER' in cell:
try:
s = self.tech.schema['cells'][data['cell']]['size']
self.stats['fill'] += s[0] * s[1]
self.stats_count['fill'] += 1
except:
pass
elif 'ANTENNA' in cell:
try:
s = self.tech.schema['cells'][data['cell']]['size']
self.stats['antenna'] += s[0] * s[1]
self.stats_count['antenna'] += 1
except:
pass
elif 'TAP' in cell:
try:
s = self.tech.schema['cells'][data['cell']]['size']
self.stats['tap'] += s[0] * s[1]
self.stats_count['tap'] += 1
except:
pass
elif 'PHY' in cell:
try:
s = self.tech.schema['cells'][data['cell']]['size']
self.stats['other'] += s[0] * s[1]
self.stats_count['other'] += 1
except:
pass
else:
if self.is_ff(data['cell']):
try:
s = self.tech.schema['cells'][data['cell']]['size']
self.stats['ff'] += s[0] * s[1]
self.stats_count['ff'] += 1
except:
logging.debug(f"non-primitive cell: {data['cell']}")
else:
try:
s = self.tech.schema['cells'][data['cell']]['size']
self.stats['logic'] += s[0] * s[1]
self.stats_count['logic'] += 1
except:
logging.debug(f"non-primitive cell: {data['cell']}")
def print_stats(self):
pp = pprint.PrettyPrinter(indent=2)
logging.info("By area (drawn micron^2):")
pp.pprint(self.stats)
logging.info("By count:")
pp.pprint(self.stats_count)
def shorten_cellname(self, name):
return name
def redact_cellname(self, name):
m = hashlib.sha256()
m.update(name.encode('utf-8'))
return m.hexdigest()[:20]
def set_func_count(self, count):
self.pallette.set_func_count(count)