; RUN: llhd-opt %s -p deseq proc %ff_clkrise_gated (i1$ %CLK, i32$ %D, i1$ %EN) -> (i32$ %Q) { init: %CLK1 = prb i1$ %CLK %0 = const i1 0 %1 = eq i1 %CLK1, %0 %3 = const time 0s 1d wait %check, %CLK check: %D1 = prb i32$ %D %CLK2 = prb i1$ %CLK %4 = neq i1 %CLK2, %0 %posedge = and i1 %1, %4 %EN1 = prb i1$ %EN %trigger = and i1 %posedge, %EN1 drv i32$ %Q if %trigger, %D1, %3 br %init } ; CHECK: entity %ff_clkrise_gated (i1$ %CLK, i32$ %D, i1$ %EN) -> (i32$ %Q) { ; CHECK: %0 = prb i1$ %EN ; CHECK: %D1 = prb i32$ %D ; CHECK: %1 = prb i1$ %CLK ; CHECK: reg i32$ %Q, [%D1, rise %1, if %0] ; CHECK: } proc %ff_clkfall_invgated (i1$ %CLK, i32$ %D, i1$ %EN) -> (i32$ %Q) { init: %CLK1 = prb i1$ %CLK %0 = const i1 1 %1 = eq i1 %CLK1, %0 %3 = const time 0s 1d wait %check, %CLK check: %D1 = prb i32$ %D %CLK2 = prb i1$ %CLK %4 = neq i1 %CLK2, %0 %posedge = and i1 %1, %4 %EN1 = prb i1$ %EN %notEN1 = not i1 %EN1 %trigger = and i1 %posedge, %notEN1 drv i32$ %Q if %trigger, %D1, %3 br %init } ; CHECK: entity %ff_clkfall_invgated (i1$ %CLK, i32$ %D, i1$ %EN) -> (i32$ %Q) { ; CHECK: %0 = prb i1$ %EN ; CHECK: %1 = not i1 %0 ; CHECK: %D1 = prb i32$ %D ; CHECK: %2 = prb i1$ %CLK ; CHECK: reg i32$ %Q, [%D1, fall %2, if %1] ; CHECK: } proc %ff_weird (i1$ %CLK, i32$ %D, i1$ %EN) -> (i32$ %Q) { init: %CLK1 = prb i1$ %CLK %0 = const i1 0 %1 = eq i1 %CLK1, %0 %3 = const time 0s 1d wait %check, %CLK check: %D1 = prb i32$ %D %CLK2 = prb i1$ %CLK %4 = neq i1 %CLK2, %0 %EN1 = prb i1$ %EN %6 = xor i1 %1, %EN1 %7 = xor i1 %4, %EN1 %posedge = and i1 %6, %7 drv i32$ %Q if %posedge, %D1, %3 br %init } ; CHECK: entity %ff_weird (i1$ %CLK, i32$ %D, i1$ %EN) -> (i32$ %Q) { ; CHECK: %0 = prb i1$ %EN ; CHECK: %D1 = prb i32$ %D ; CHECK: %1 = prb i1$ %CLK ; CHECK: %2 = prb i1$ %EN ; CHECK: %3 = not i1 %2 ; CHECK: %4 = prb i1$ %CLK ; CHECK: reg i32$ %Q, [%D1, fall %1, if %0], [%D1, rise %4, if %3] ; CHECK: }