llhd 0.15.0

A Low Level Hardware Description that acts as a foundation for building hardware design tools.
Documentation
proc @regfile.always_comb ([1 x i5]$ %waddr_i, i1$ %we_i) -> ([1 x i32]$ %we_dec) {
0:
    br %body
body:
    %1 = const i32 0
    %j = var i32 %1
    br %loop_body
check:
    wait %body, %waddr_i, %we_i
loop_body:
    %j1 = ld i32* %j
    %2 = const i32 1
    %3 = slt i32 %j1, %2
    br %3, %loop_exit, %loop_continue
loop_exit:
    br %check
loop_continue:
    %4 = const i32 0
    %i = var i32 %4
    br %loop_body1
loop_body1:
    %i1 = ld i32* %i
    %5 = const i32 32
    %6 = slt i32 %i1, %5
    br %6, %loop_exit1, %loop_continue1
loop_exit1:
    %j2 = ld i32* %j
    %7 = const i32 1
    %8 = add i32 %j2, %7
    st i32* %j, %8
    %j3 = ld i32* %j
    %9 = const i32 0
    %10 = neq i32 %j3, %9
    br %loop_body
loop_continue1:
    %11 = const i32 0
    %waddr_i1 = prb [1 x i5]$ %waddr_i
    %j4 = ld i32* %j
    %12 = const i5 0
    %13 = [1 x i5 %12]
    %14 = shr [1 x i5] %waddr_i1, [1 x i5] %13, i32 %j4
    %15 = extf i5, [1 x i5] %14, 0
    %16 = inss i32 %11, i5 %15, 0, 5
    %i2 = ld i32* %i
    %17 = eq i32 %16, %i2
    br %17, %if_false, %if_true
if_true:
    %j5 = ld i32* %j
    %18 = const i32 0
    %19 = [1 x i32 %18]
    %20 = sig [1 x i32] %19
    %21 = shr [1 x i32]$ %we_dec, [1 x i32]$ %20, i32 %j5
    %22 = extf i32$, [1 x i32]$ %21, 0
    %i3 = ld i32* %i
    %23 = const i32 0
    %24 = sig i32 %23
    %25 = shr i32$ %22, i32$ %24, i32 %i3
    %26 = exts i1$, i32$ %25, 0, 1
    %we_i1 = prb i1$ %we_i
    %j6 = ld i32* %j
    %27 = const i1 0
    %28 = shr i1 %we_i1, i1 %27, i32 %j6
    %29 = exts i1, i1 %28, 0, 1
    %30 = const time 0s 1e
    drv i1$ %26, %29, %30
    br %if_exit
if_false:
    %j7 = ld i32* %j
    %31 = const i32 0
    %32 = [1 x i32 %31]
    %33 = sig [1 x i32] %32
    %34 = shr [1 x i32]$ %we_dec, [1 x i32]$ %33, i32 %j7
    %35 = extf i32$, [1 x i32]$ %34, 0
    %i4 = ld i32* %i
    %36 = const i32 0
    %37 = sig i32 %36
    %38 = shr i32$ %35, i32$ %37, i32 %i4
    %39 = exts i1$, i32$ %38, 0, 1
    %40 = const i1 0
    %41 = const time 0s 1e
    drv i1$ %39, %40, %41
    br %if_exit
if_exit:
    %i5 = ld i32* %i
    %42 = const i32 1
    %43 = add i32 %i5, %42
    st i32* %i, %43
    %i6 = ld i32* %i
    %44 = const i32 0
    %45 = neq i32 %i6, %44
    br %loop_body1
}

proc @regfile.always_ff (i1$ %clk_i, [1 x i32]$ %wdata_i, [1 x i32]$ %we_dec) -> ([32 x i32]$ %mem) {
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:
    %4 = const i32 0
    %j = var i32 %4
    br %loop_body
loop_body:
    %j1 = ld i32* %j
    %5 = const i32 1
    %6 = slt i32 %j1, %5
    br %6, %loop_exit, %loop_continue
loop_exit:
    br %0
loop_continue:
    %7 = const i32 0
    %i = var i32 %7
    br %loop_body1
loop_body1:
    %i1 = ld i32* %i
    %8 = const i32 32
    %9 = slt i32 %i1, %8
    br %9, %loop_exit1, %loop_continue1
loop_exit1:
    %10 = const i32 1
    %11 = const i32 0
    %12 = neq i32 %10, %11
    br %12, %if_false, %if_true
loop_continue1:
    %we_dec1 = prb [1 x i32]$ %we_dec
    %j2 = ld i32* %j
    %13 = const i32 0
    %14 = [1 x i32 %13]
    %15 = shr [1 x i32] %we_dec1, [1 x i32] %14, i32 %j2
    %16 = extf i32, [1 x i32] %15, 0
    %i2 = ld i32* %i
    %17 = const i32 0
    %18 = shr i32 %16, i32 %17, i32 %i2
    %19 = exts i1, i32 %18, 0, 1
    br %19, %if_false1, %if_true1
if_true1:
    %i3 = ld i32* %i
    %20 = const i32 0
    %21 = [32 x i32 %20]
    %22 = sig [32 x i32] %21
    %23 = shr [32 x i32]$ %mem, [32 x i32]$ %22, i32 %i3
    %24 = extf i32$, [32 x i32]$ %23, 0
    %wdata_i1 = prb [1 x i32]$ %wdata_i
    %j3 = ld i32* %j
    %25 = const i32 0
    %26 = [1 x i32 %25]
    %27 = shr [1 x i32] %wdata_i1, [1 x i32] %26, i32 %j3
    %28 = extf i32, [1 x i32] %27, 0
    %29 = const time 0s 1d
    drv i32$ %24, %28, %29
    br %if_exit
if_false1:
    br %if_exit
if_exit:
    %i4 = ld i32* %i
    %30 = const i32 1
    %31 = add i32 %i4, %30
    st i32* %i, %31
    %i5 = ld i32* %i
    %32 = const i32 0
    %33 = neq i32 %i5, %32
    br %loop_body1
if_true:
    %34 = const i32 0
    %35 = const i32 0
    %36 = [32 x i32 %35]
    %37 = sig [32 x i32] %36
    %38 = shr [32 x i32]$ %mem, [32 x i32]$ %37, i32 %34
    %39 = extf i32$, [32 x i32]$ %38, 0
    %40 = const i32 0
    %41 = const i1 0
    %42 = inss i32 %40, i1 %41, 0, 1
    %43 = const time 0s 1d
    drv i32$ %39, %42, %43
    br %if_exit1
if_false:
    br %if_exit1
if_exit1:
    %j4 = ld i32* %j
    %44 = const i32 1
    %45 = add i32 %j4, %44
    st i32* %j, %45
    %j5 = ld i32* %j
    %46 = const i32 0
    %47 = neq i32 %j5, %46
    br %loop_body
}

entity @regfile (i1$ %clk_i, [2 x i5]$ %raddr_i, [1 x i5]$ %waddr_i, [1 x i32]$ %wdata_i, i1$ %we_i) -> ([2 x i32]$ %rdata_o) {
    %0 = const i32 0
    %1 = const i32 0
    %2 = const i32 0
    %3 = const i32 0
    %4 = const i32 0
    %5 = const i32 0
    %6 = const i32 0
    %7 = const i32 0
    %8 = const i32 0
    %9 = const i32 0
    %10 = const i32 0
    %11 = const i32 0
    %12 = const i32 0
    %13 = const i32 0
    %14 = const i32 0
    %15 = const i32 0
    %16 = const i32 0
    %17 = const i32 0
    %18 = const i32 0
    %19 = const i32 0
    %20 = const i32 0
    %21 = const i32 0
    %22 = const i32 0
    %23 = const i32 0
    %24 = const i32 0
    %25 = const i32 0
    %26 = const i32 0
    %27 = const i32 0
    %28 = const i32 0
    %29 = const i32 0
    %30 = const i32 0
    %31 = const i32 0
    %32 = [i32 %0, %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]
    %mem = sig [32 x i32] %32
    %33 = const i32 0
    %34 = [i32 %33]
    %we_dec = sig [1 x i32] %34
    %35 = const i32 0
    %36 = const i32 0
    %37 = [2 x i32 %36]
    %38 = sig [2 x i32] %37
    %39 = shr [2 x i32]$ %rdata_o, [2 x i32]$ %38, i32 %35
    %40 = extf i32$, [2 x i32]$ %39, 0
    %mem1 = prb [32 x i32]$ %mem
    %raddr_i1 = prb [2 x i5]$ %raddr_i
    %41 = const i32 0
    %42 = const i5 0
    %43 = [2 x i5 %42]
    %44 = shr [2 x i5] %raddr_i1, [2 x i5] %43, i32 %41
    %45 = extf i5, [2 x i5] %44, 0
    %46 = const i32 0
    %47 = [32 x i32 %46]
    %48 = shr [32 x i32] %mem1, [32 x i32] %47, i5 %45
    %49 = extf i32, [32 x i32] %48, 0
    %50 = const time 0s 1e
    drv i32$ %40, %49, %50
    %51 = const i32 1
    %52 = const i32 0
    %53 = [2 x i32 %52]
    %54 = sig [2 x i32] %53
    %55 = shr [2 x i32]$ %rdata_o, [2 x i32]$ %54, i32 %51
    %56 = extf i32$, [2 x i32]$ %55, 0
    %mem2 = prb [32 x i32]$ %mem
    %raddr_i2 = prb [2 x i5]$ %raddr_i
    %57 = const i32 1
    %58 = const i5 0
    %59 = [2 x i5 %58]
    %60 = shr [2 x i5] %raddr_i2, [2 x i5] %59, i32 %57
    %61 = extf i5, [2 x i5] %60, 0
    %62 = const i32 0
    %63 = [32 x i32 %62]
    %64 = shr [32 x i32] %mem2, [32 x i32] %63, i5 %61
    %65 = extf i32, [32 x i32] %64, 0
    %66 = const time 0s 1e
    drv i32$ %56, %65, %66
    inst @regfile.always_comb ([1 x i5]$ %waddr_i, i1$ %we_i) -> ([1 x i32]$ %we_dec)
    inst @regfile.always_ff (i1$ %clk_i, [1 x i32]$ %wdata_i, [1 x i32]$ %we_dec) -> ([32 x i32]$ %mem)
    %67 = const i32 0
    %68 = const i32 0
    %69 = [i32 %67, %68]
    %70 = const time 0s
    drv [2 x i32]$ %rdata_o, %69, %70
}