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
|
WHEN EXPANSION
Goal:
reg r
wire w
when p1 :
w := b
r.init := x
when p2 :
w := c
r := d
r := e
==>
1. Remove last connect semantics
2. Remove conditional blocks
3. Eliminate concept of scoping
Exp | Value
--------------
r | e
w | mux(p1,mux(p2,c,b),null)
r.init | mux(p1,x,null)
==>
Symbolic Value - what can appear in value column
sv = e
| null
| svmux(e,sv1,sv2)
State:
{
r => void
r.init => p1
w => svmux(e,_,_)
}
==>
Build two tables, one mapping symbols to symbolic values, and another mapping symbols to declared types
if w is a wire:
merge {r=>x, w=>y} with {r=>x} under p : {r=>svmux(p,x,x), w=>y}
if s is a reg:
merge {r=>x,s=>y} with {r=>x} under p : {r=>svmux(p,x,x), s=>svmux(p,y,void)}
|