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)} 
;this is to correctly calculate the ENABLE signal! when actually calculating the input, we will reduce it
;actually, since we will be doing the reducing anyways, we might as well not do anything different for wires, 
;  and instead do the reduction step separately

wire r     {r=>VOID}
r := x     {r=>x}
when p     {r=>x}
  reg s    {r=>x,s=>VOID}
  s := y   {r=>x,s=>y}
  wire w   {r=>x,s=>y,w=>VOID}
else       {r=>x}
  reg s    {r=>x,s=>VOID}
  wire w   {r=>x,s=>VOID,w=>VOID}
  w := z   {r=>x,s=>VOID,w=>z}
  w := y   {r=>x,s=>y,w=>y}
else 
  emptystmt {r=>x}
;merge table-c with table-a
;get unique keys of table-a + table-c
; (r,s,w)
{r=>(p?x:x),s=>(p?y:VOID),w=>(p?y:VOID)}





