llhd 0.15.0

A Low Level Hardware Description that acts as a foundation for building hardware design tools.
Documentation
; RUN: llhd-opt %s
proc %always_ff (i1$ %clk_i, i1$ %rst_i, i32$ %pc_d) -> (i32$ %pc_q) {
0:
    br %init
init:
    %clk_i1 = prb i1$ %clk_i
    wait %check, %clk_i
check:
    %clk_i2 = prb i1$ %clk_i
    %1 = const i1 0
    %2 = eq i1 %clk_i1, %1
    %3 = neq i1 %clk_i2, %1
    %posedge = and i1 %2, %3
    br %posedge, %init, %event
event:
    %rst_i1 = prb i1$ %rst_i
    %4 = const i32 65536
    %pc_d1 = prb i32$ %pc_d
    %5 = [i32 %pc_d1, %4]
    %6 = mux [2 x i32] %5, i1 %rst_i1
    %7 = const time 0s 1d
    drv i32$ %pc_q, %6, %7
    br %0
}

; CHECK:  proc %always_ff (i1$ %clk_i, i1$ %rst_i, i32$ %pc_d) -> (i32$ %pc_q) {
; CHECK:  init:
; CHECK:      %clk_i1 = prb i1$ %clk_i
; CHECK:      %0 = const i1 0
; CHECK:      %1 = eq i1 %clk_i1, %0
; CHECK:      %2 = const i32 65536
; CHECK:      %3 = const time 0s 1d
; CHECK:      wait %check, %clk_i
; CHECK:  check:
; CHECK:      %pc_d1 = prb i32$ %pc_d
; CHECK:      %rst_i1 = prb i1$ %rst_i
; CHECK:      %clk_i2 = prb i1$ %clk_i
; CHECK:      %4 = neq i1 %clk_i2, %0
; CHECK:      %posedge = and i1 %1, %4
; CHECK:      %5 = [i32 %pc_d1, %2]
; CHECK:      %6 = mux [2 x i32] %5, i1 %rst_i1
; CHECK:      drv i32$ %pc_q if %posedge, %6, %3
; CHECK:      br %init
; CHECK:  }