-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcorners.py
106 lines (66 loc) · 2.22 KB
/
corners.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
104
105
106
import itertools
from collections import defaultdict
import utils
from configuration import Configuration
from corner import Corner
class Corners:
def __init__ (
self,
recipe_pretty_name,
overclock_limits,
somersloop_slots
):
if overclock_limits != None:
overclock_points = list ()
if (
overclock_limits . min_clock_speed <= 1.0
and overclock_limits . max_clock_speed >= 1.0
):
overclock_points . append (1.0)
if overclock_limits . min_clock_speed not in overclock_points:
overclock_points . append (overclock_limits . min_clock_speed)
if overclock_limits . max_clock_speed not in overclock_points:
overclock_points . append (overclock_limits . max_clock_speed)
else:
overclock_points = [None]
if somersloop_slots != None:
productivity_points = [0.0] + [1.0 / i for i in range (somersloop_slots, 1, -1)]
else:
productivity_points = [None]
self . corners = list (
Corner (recipe_pretty_name, clock_speed, productivity_bonus)
for clock_speed, productivity_bonus
in itertools . product (overclock_points, productivity_points)
)
def machine_count (self):
return sum (corner . machine_count () for corner in self . corners)
def input_magnitude (self):
return sum (corner . input_magnitude () for corner in self . corners)
def output_magnitude (self):
return sum (corner . output_magnitude () for corner in self . corners)
def power_magnitude (self, machine):
return sum (
corner . power_magnitude (machine)
for corner in self . corners
)
def somersloops_slotted (self, machine):
return sum (
corner . somersloops_slotted (machine) for corner in self . corners
)
def add_constraints (self, constraints):
for corner in self . corners:
corner . add_constraints (constraints)
def interpret_model (self, model, machine, precision):
configurations = defaultdict (Configuration)
for corner in self . corners:
interpreted_corner = corner . interpret_model (model, machine)
if (
utils . interpret_approximate (
interpreted_corner . machine_count,
precision
) != 0
):
configurations [
interpreted_corner . somersloop_factor
] . add_corner_machines (interpreted_corner)
return configurations