Sign extend an arg to width n:
fun sex n nil = if n<=0 then nil else raise "cannot do sex on an empty list" | sex n [item] = if n<=1 then [item] else item :: sex (n-1) [item] | sex n (h::t) = h :: (sex (n-1) t);Example: integer constant:
| pandex w (Num n) = if n = 0 then [ xi_false ] else
let fun k 0 = nil (* lsb first *)
| k n = (if (n mod 2)=1 then xi_true else xi_false) :: k (n div 2)
fun q 0 = [xi_true] (* final negative sign bit *)
| q n = (if (n mod 2)=0 then xi_true else xi_false) :: q (n div 2)
in if (n >= 0) then k n else sex w (q (0-1-n)) end
Example: -4 in a 6 bit field is 111100.
Example: conditional expression: a broadside multiplexor:
| pandex w (Query(g, t, f)) =
let val t' = pandex w t
val f' = pandex w f
fun k([], []) = []
| k(a, nil) = k(a, [ false ])
| k(nil, b) = k([ false ], b)
| k(a::at, b::bt) = gen_mux2(g, a, b) :: k(at, bt)
in k(t', f') end
See other examples in the multipler/adder additional material.