-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconfig.go
139 lines (126 loc) · 2.63 KB
/
config.go
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package gmars
import "fmt"
type SimulatorConfig struct {
Mode SimulatorMode
CoreSize Address
Processes Address
Cycles Address
ReadLimit Address
WriteLimit Address
Length Address
Distance Address
}
var (
ConfigKOTH88 = SimulatorConfig{
Mode: ICWS88,
CoreSize: 8000,
Processes: 8000,
Cycles: 80000,
ReadLimit: 8000,
WriteLimit: 8000,
Length: 100,
Distance: 100,
}
ConfigICWS88 = SimulatorConfig{
Mode: ICWS88,
CoreSize: 8192,
Processes: 8000,
Cycles: 10000,
ReadLimit: 8000,
WriteLimit: 8000,
Length: 300,
Distance: 100,
}
ConfigNOP94 = SimulatorConfig{
Mode: ICWS94,
CoreSize: 8000,
Processes: 8000,
Cycles: 80000,
ReadLimit: 8000,
WriteLimit: 8000,
Length: 100,
Distance: 100,
}
ConfigNopTiny = SimulatorConfig{
Mode: NOP94,
CoreSize: 800,
Processes: 800,
Cycles: 8000,
ReadLimit: 800,
WriteLimit: 800,
Length: 20,
Distance: 20,
}
ConfigNop256 = SimulatorConfig{
Mode: NOP94,
CoreSize: 256,
Processes: 60,
Cycles: 2560,
ReadLimit: 800,
WriteLimit: 800,
Length: 10,
Distance: 10,
}
ConfigNopNano = SimulatorConfig{
Mode: NOP94,
CoreSize: 80,
Processes: 80,
Cycles: 800,
ReadLimit: 80,
WriteLimit: 80,
Length: 5,
Distance: 5,
}
configPresets = map[string]SimulatorConfig{
"88": ConfigKOTH88,
"icws": ConfigICWS88,
"nop94": ConfigNOP94,
"noptiny": ConfigNopTiny,
"nop256": ConfigNop256,
"nopnano": ConfigNopNano,
}
)
func PresetConfig(name string) (SimulatorConfig, error) {
config, ok := configPresets[name]
if !ok {
return SimulatorConfig{}, fmt.Errorf("preset '%s' not found", name)
}
return config, nil
}
func NewQuickConfig(mode SimulatorMode, coreSize, processes, cycles, length Address) SimulatorConfig {
out := SimulatorConfig{
Mode: mode,
CoreSize: coreSize,
Processes: processes,
Cycles: cycles,
ReadLimit: coreSize,
WriteLimit: coreSize,
Length: length,
Distance: length,
}
return out
}
func (c SimulatorConfig) Validate() error {
if c.CoreSize < 3 {
return fmt.Errorf("the minimum core size is 3")
}
if c.Processes < 1 {
return fmt.Errorf("invalid process limit")
}
if c.ReadLimit < 1 {
return fmt.Errorf("invalid read limit")
}
if c.WriteLimit < 1 {
return fmt.Errorf("invalid read limit")
}
if c.Cycles < 1 {
return fmt.Errorf("invalid cycle count")
}
if c.Length > c.CoreSize {
return fmt.Errorf("invalid warrior length")
}
if c.Length+c.Distance > c.CoreSize {
return fmt.Errorf("invalid distance")
}
return nil
}