Skip to content

Commit 5f33240

Browse files
authored
Merge pull request #49 from sarchlab/new_verify_update
add policy change feature
2 parents ef144c1 + 34e76e1 commit 5f33240

26 files changed

Lines changed: 5381 additions & 473 deletions

File tree

api/driver.go

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,19 @@ func (d *driverImpl) doOneFeedInTask(task *feedInTask) bool {
145145
panic("CGRA cannot handle the data rate")
146146
}
147147

148-
core.Trace("DataFlow",
149-
"Behavior", "FeedIn",
150-
slog.Float64("Time", float64(d.Engine.CurrentTime()*1e9)),
151-
"Data", task.data[dataIndex],
152-
"Color", task.color,
153-
"From", port.Name(),
154-
"To", task.remotePorts[i],
155-
)
148+
timeValue := float64(d.Engine.CurrentTime() * 1e9)
149+
if core.TraceEnabled() {
150+
core.Trace("DataFlow",
151+
"Behavior", "FeedIn",
152+
slog.Float64("Time", timeValue),
153+
"Data", task.data[dataIndex],
154+
"Color", task.color,
155+
"From", port.Name(),
156+
"To", task.remotePorts[i],
157+
)
158+
} else {
159+
core.ObserveDataFlow("FeedIn", timeValue, port.Name(), string(task.remotePorts[i]), "", "")
160+
}
156161
task.portRounds[i]++
157162
madeProgress = true
158163
}
@@ -202,15 +207,20 @@ func (d *driverImpl) doOneCollectTask(task *collectTask) bool {
202207
}
203208
task.data[dataIndex] = msg.Data.First()
204209

205-
core.Trace("DataFlow",
206-
"Behavior", "Collect",
207-
slog.Float64("Time", float64(d.Engine.CurrentTime()*1e9)),
208-
"Data", msg.Data.First(),
209-
"Pred", msg.Data.Pred,
210-
"Color", task.color,
211-
"From", task.ports[i].Name(),
212-
"To", "None",
213-
)
210+
timeValue := float64(d.Engine.CurrentTime() * 1e9)
211+
if core.TraceEnabled() {
212+
core.Trace("DataFlow",
213+
"Behavior", "Collect",
214+
slog.Float64("Time", timeValue),
215+
"Data", msg.Data.First(),
216+
"Pred", msg.Data.Pred,
217+
"Color", task.color,
218+
"From", task.ports[i].Name(),
219+
"To", "None",
220+
)
221+
} else {
222+
core.ObserveDataFlow("Collect", timeValue, task.ports[i].Name(), "None", "", "")
223+
}
214224

215225
task.portRounds[i]++
216226
madeProgress = true

config/config.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ type DeviceBuilder struct {
2020
freq sim.Freq
2121
monitor *monitoring.Monitor
2222
//portFactory portFactory
23-
width, height int
24-
memoryMode string // simple or shared or local
25-
memoryShare map[[2]int]int //map[[x, y]]GroupID
23+
width, height int
24+
memoryMode string // simple or shared or local
25+
memoryShare map[[2]int]int //map[[x, y]]GroupID
26+
executionPolicy string
2627
}
2728

2829
// type portFactory interface {
@@ -74,6 +75,12 @@ func (d DeviceBuilder) WithMemoryShare(share map[[2]int]int) DeviceBuilder {
7475
return d
7576
}
7677

78+
// WithExecutionPolicy sets core execution policy.
79+
func (d DeviceBuilder) WithExecutionPolicy(policy string) DeviceBuilder {
80+
d.executionPolicy = policy
81+
return d
82+
}
83+
7784
// Build creates a CGRA device.
7885
func (d DeviceBuilder) Build(name string) cgra.Device {
7986
dev := &device{
@@ -188,6 +195,7 @@ func (d DeviceBuilder) createTiles(
188195
WithExitAddr(&exit).
189196
WithRetValAddr(&retVal).
190197
WithExitReqAddr(&exitReqTimestamp).
198+
WithExecutionPolicy(d.executionPolicy).
191199
Build(coreName)
192200

193201
if d.monitor != nil {

core/builder.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import (
77

88
// Builder can create new cores.
99
type Builder struct {
10-
engine sim.Engine
11-
freq sim.Freq
12-
exitAddr *bool
13-
retValAddr *uint32
14-
exitReqAddr *float64
10+
engine sim.Engine
11+
freq sim.Freq
12+
exitAddr *bool
13+
retValAddr *uint32
14+
exitReqAddr *float64
15+
executionPolicy string
1516
}
1617

1718
// WithEngine sets the engine.
@@ -43,6 +44,12 @@ func (b Builder) WithExitReqAddr(exitReqAddr *float64) Builder {
4344
return b
4445
}
4546

47+
// WithExecutionPolicy sets the execution policy for issue-time gating.
48+
func (b Builder) WithExecutionPolicy(policy string) Builder {
49+
b.executionPolicy = policy
50+
return b
51+
}
52+
4653
// Build creates a core.
4754
//
4855
//nolint:funlen
@@ -51,7 +58,8 @@ func (b Builder) Build(name string) *Core {
5158

5259
c.TickingComponent = sim.NewTickingComponent(name, b.engine, b.freq, c)
5360
c.emu = instEmulator{
54-
CareFlags: true,
61+
CareFlags: true,
62+
ExecutionPolicy: normalizeExecutionPolicyString(b.executionPolicy),
5563
}
5664
c.state = coreState{
5765
exit: b.exitAddr,
@@ -80,6 +88,7 @@ func (b Builder) Build(name string) *Core {
8088
IsToWriteMemory: false,
8189
States: make(map[string]interface{}),
8290
Mode: SyncOp,
91+
CurrentCycle: 0,
8392
CurrReservationState: ReservationState{
8493
ReservationMap: make(map[int]bool),
8594
OpToExec: 0,

core/core.go

Lines changed: 99 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,19 @@ func (c *Core) WriteMemory(x int, y int, data uint32, baseAddr uint32) {
5959
if x == int(c.state.TileX) && y == int(c.state.TileY) {
6060
c.state.Memory[baseAddr] = data
6161
//fmt.Printf("Core [%d][%d] write memory[%d] = %d\n", c.state.TileX, c.state.TileY, baseAddr, c.state.Memory[baseAddr])
62-
Trace("Memory",
63-
"Behavior", "WriteMemory",
64-
"Time", float64(c.Engine.CurrentTime()*1e9),
65-
"Data", data,
66-
"X", x,
67-
"Y", y,
68-
"Addr", baseAddr,
69-
)
62+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
63+
if TraceEnabled() {
64+
Trace("Memory",
65+
"Behavior", "WriteMemory",
66+
"Time", timeValue,
67+
"Data", data,
68+
"X", x,
69+
"Y", y,
70+
"Addr", baseAddr,
71+
)
72+
} else {
73+
ObserveMemory("WriteMemory", timeValue, x, y, "", "")
74+
}
7075
} else {
7176
panic(fmt.Sprintf("Invalid Tile: Expect (%d, %d),but get (%d, %d)", c.state.TileX, c.state.TileY, x, y))
7277
}
@@ -85,6 +90,7 @@ func (c *Core) MapProgram(program interface{}, x int, y int) {
8590
panic("MapProgram expects core.Program type")
8691
}
8792
c.state.PCInBlock = -1
93+
c.state.CurrentCycle = 0
8894
c.state.TileX = uint32(x)
8995
c.state.TileY = uint32(y)
9096
}
@@ -96,13 +102,15 @@ func (c *Core) Tick() (madeProgress bool) {
96102
// madeProgress = c.emu.runRoutingRules(&c.state) || madeProgress
97103
madeProgress = c.runProgram() || madeProgress
98104
madeProgress = c.doSend() || madeProgress
105+
c.state.CurrentCycle++
99106
return madeProgress
100107
}
101108

102109
func makeBytesFromUint32(data uint32) []byte {
103110
return []byte{byte(data >> 24), byte(data >> 16), byte(data >> 8), byte(data)}
104111
}
105112

113+
//nolint:gocyclo
106114
func (c *Core) doSend() bool {
107115
madeProgress := false
108116
for i := 0; i < 8; i++ { // only 8 directions
@@ -127,15 +135,20 @@ func (c *Core) doSend() bool {
127135
continue
128136
}
129137

130-
Trace("DataFlow",
131-
"Behavior", "Send",
132-
slog.Float64("Time", float64(c.Engine.CurrentTime()*1e9)),
133-
"Data", msg.Data.First(),
134-
"Pred", c.state.SendBufHead[color][i].Pred,
135-
"Color", color,
136-
"Src", msg.Src,
137-
"Dst", msg.Dst,
138-
)
138+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
139+
if TraceEnabled() {
140+
Trace("DataFlow",
141+
"Behavior", "Send",
142+
slog.Float64("Time", timeValue),
143+
"Data", msg.Data.First(),
144+
"Pred", c.state.SendBufHead[color][i].Pred,
145+
"Color", color,
146+
"Src", msg.Src,
147+
"Dst", msg.Dst,
148+
)
149+
} else {
150+
ObserveDataFlow("Send", timeValue, "", "", string(msg.Src), string(msg.Dst))
151+
}
139152
c.state.SendBufHeadBusy[color][i] = false
140153
}
141154
}
@@ -156,15 +169,20 @@ func (c *Core) doSend() bool {
156169
return madeProgress
157170
}
158171

159-
Trace("Memory",
160-
"Behavior", "Send",
161-
slog.Float64("Time", float64(c.Engine.CurrentTime()*1e9)),
162-
"Data", c.state.SendBufHead[c.emu.getColorIndex("R")][cgra.Router].First(),
163-
"Pred", c.state.SendBufHead[c.emu.getColorIndex("R")][cgra.Router].Pred,
164-
"Color", "R",
165-
"Src", msg.Src,
166-
"Dst", msg.Dst,
167-
)
172+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
173+
if TraceEnabled() {
174+
Trace("Memory",
175+
"Behavior", "Send",
176+
slog.Float64("Time", timeValue),
177+
"Data", c.state.SendBufHead[c.emu.getColorIndex("R")][cgra.Router].First(),
178+
"Pred", c.state.SendBufHead[c.emu.getColorIndex("R")][cgra.Router].Pred,
179+
"Color", "R",
180+
"Src", msg.Src,
181+
"Dst", msg.Dst,
182+
)
183+
} else {
184+
ObserveMemory("Send", timeValue, int(c.state.TileX), int(c.state.TileY), string(msg.Src), string(msg.Dst))
185+
}
168186
c.state.SendBufHeadBusy[c.emu.getColorIndex("R")][cgra.Router] = false
169187
} else {
170188
msg := mem.ReadReqBuilder{}.
@@ -179,14 +197,19 @@ func (c *Core) doSend() bool {
179197
return madeProgress
180198
}
181199

182-
Trace("Memory",
183-
"Behavior", "Send",
184-
slog.Float64("Time", float64(c.Engine.CurrentTime()*1e9)),
185-
"Data", c.state.AddrBuf,
186-
"Color", "R",
187-
"Src", msg.Src,
188-
"Dst", msg.Dst,
189-
)
200+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
201+
if TraceEnabled() {
202+
Trace("Memory",
203+
"Behavior", "Send",
204+
slog.Float64("Time", timeValue),
205+
"Data", c.state.AddrBuf,
206+
"Color", "R",
207+
"Src", msg.Src,
208+
"Dst", msg.Dst,
209+
)
210+
} else {
211+
ObserveMemory("Send", timeValue, int(c.state.TileX), int(c.state.TileY), string(msg.Src), string(msg.Dst))
212+
}
190213
c.state.SendBufHeadBusy[c.emu.getColorIndex("R")][cgra.Router] = false
191214
}
192215
}
@@ -198,6 +221,7 @@ func convert4BytesToUint32(data []byte) uint32 {
198221
return uint32(data[0])<<24 | uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
199222
}
200223

224+
//nolint:gocyclo
201225
func (c *Core) doRecv() bool {
202226
madeProgress := false
203227
for i := 0; i < 8; i++ { //direction
@@ -226,15 +250,20 @@ func (c *Core) doRecv() bool {
226250
c.state.RecvBufHeadReady[color][i] = true
227251
c.state.RecvBufHead[color][i] = msg.Data
228252

229-
Trace("DataFlow",
230-
"Behavior", "Recv",
231-
"Time", float64(c.Engine.CurrentTime()*1e9),
232-
"Data", msg.Data.First(),
233-
"Pred", c.state.RecvBufHead[color][i].Pred,
234-
"Src", msg.Src,
235-
"Dst", msg.Dst,
236-
"Color", color,
237-
)
253+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
254+
if TraceEnabled() {
255+
Trace("DataFlow",
256+
"Behavior", "Recv",
257+
"Time", timeValue,
258+
"Data", msg.Data.First(),
259+
"Pred", c.state.RecvBufHead[color][i].Pred,
260+
"Src", msg.Src,
261+
"Dst", msg.Dst,
262+
"Color", color,
263+
)
264+
} else {
265+
ObserveDataFlow("Recv", timeValue, "", "", string(msg.Src), string(msg.Dst))
266+
}
238267

239268
c.ports[cgra.Side(i)].local.RetrieveIncoming()
240269
madeProgress = true
@@ -254,30 +283,40 @@ func (c *Core) doRecv() bool {
254283
c.state.RecvBufHeadReady[c.emu.getColorIndex("R")][cgra.Router] = true
255284
c.state.RecvBufHead[c.emu.getColorIndex("R")][cgra.Router] = cgra.NewScalar(convert4BytesToUint32(msg.Data))
256285

257-
Trace("Memory",
258-
"Behavior", "Recv",
259-
"Time", float64(c.Engine.CurrentTime()*1e9),
260-
"Data", msg.Data,
261-
"Src", msg.Src,
262-
"Dst", msg.Dst,
263-
"Pred", c.state.RecvBufHead[c.emu.getColorIndex("R")][cgra.Router].Pred,
264-
"Color", "R",
265-
)
286+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
287+
if TraceEnabled() {
288+
Trace("Memory",
289+
"Behavior", "Recv",
290+
"Time", timeValue,
291+
"Data", msg.Data,
292+
"Src", msg.Src,
293+
"Dst", msg.Dst,
294+
"Pred", c.state.RecvBufHead[c.emu.getColorIndex("R")][cgra.Router].Pred,
295+
"Color", "R",
296+
)
297+
} else {
298+
ObserveMemory("Recv", timeValue, int(c.state.TileX), int(c.state.TileY), string(msg.Src), string(msg.Dst))
299+
}
266300

267301
c.ports[cgra.Router].local.RetrieveIncoming()
268302
madeProgress = true
269303
} else if msg, ok := item.(*mem.WriteDoneRsp); ok {
270304
c.state.RecvBufHeadReady[c.emu.getColorIndex("R")][cgra.Router] = true
271305
c.state.RecvBufHead[c.emu.getColorIndex("R")][cgra.Router] = cgra.NewScalar(0)
272306

273-
Trace("Memory",
274-
"Behavior", "Recv",
275-
"Time", float64(c.Engine.CurrentTime()*1e9),
276-
"Src", msg.Src,
277-
"Dst", msg.Dst,
278-
"Pred", c.state.RecvBufHead[c.emu.getColorIndex("R")][cgra.Router].Pred,
279-
"Color", "R",
280-
)
307+
timeValue := float64(c.Engine.CurrentTime() * 1e9)
308+
if TraceEnabled() {
309+
Trace("Memory",
310+
"Behavior", "Recv",
311+
"Time", timeValue,
312+
"Src", msg.Src,
313+
"Dst", msg.Dst,
314+
"Pred", c.state.RecvBufHead[c.emu.getColorIndex("R")][cgra.Router].Pred,
315+
"Color", "R",
316+
)
317+
} else {
318+
ObserveMemory("Recv", timeValue, int(c.state.TileX), int(c.state.TileY), string(msg.Src), string(msg.Dst))
319+
}
281320

282321
c.ports[cgra.Router].local.RetrieveIncoming()
283322
madeProgress = true

0 commit comments

Comments
 (0)