UNWIND_ONCE_CONVunwindLib.UNWIND_ONCE_CONV : ((term -> bool) -> conv)
Basic conversion for parallel unwinding of equations defining wire values in a standard device specification.
UNWIND_ONCE_CONV p tm unwinds the conjunction
tm using the equations selected by the predicate
p. tm should be a conjunction, equivalent
under associative-commutative reordering to:
t1 /\ t2 /\ ... /\ tn
p is used to partition the terms ti for
1 <= i <= n into two disjoint sets:
REW = {{ti | p ti}}
OBJ = {{ti | ~p ti}}
The terms ti for which p is true are then
used as a set of rewrite rules (thus they should be equations) to do a
single top-down parallel rewrite of the remaining terms. The rewritten
terms take the place of the original terms in the input conjunction. For
example, if tm is:
t1 /\ t2 /\ t3 /\ t4
and REW = {{t1,t3}} then the result is:
|- t1 /\ t2 /\ t3 /\ t4 = t1 /\ t2' /\ t3 /\ t4'
where ti' is ti rewritten with the
equations REW.
Never fails.
> UNWIND_ONCE_CONV (fn tm => mem (line_name tm) [`l1`,`l2`])
“(!(x:num). l1 x = (l2 x) - 1) /\
(!x. f x = (l2 (x+1)) + (l1 (x+2))) /\
(!x. l2 x = 7)”;
|- (!x. l1 x = (l2 x) - 1) /\
(!x. f x = (l2(x + 1)) + (l1(x + 2))) /\
(!x. l2 x = 7) =
(!x. l1 x = (l2 x) - 1) /\
(!x. f x = 7 + ((l2(x + 2)) - 1)) /\
(!x. l2 x = 7)
unwindLib.UNWIND_CONV,
unwindLib.UNWIND_ALL_BUT_CONV,
unwindLib.UNWIND_AUTO_CONV,
unwindLib.UNWIND_ALL_BUT_RIGHT_RULE,
unwindLib.UNWIND_AUTO_RIGHT_RULE