summaryrefslogblamecommitdiff
path: root/tests/clock_emile.mj
blob: 9b58d54eb2c1c533a15f2956114f8f7bdf21e02c (plain) (tree)













































































                                                              
cm_2 (i) = (s,r) where
    s = reg (i xor s);
    r = i and s
end where

add<n> (i,a:[n]) = (s:[n],r) where
    if n = 1 then
        s = a ^ i;
        r = a & i
    else
        (s_a,r) = add<n-1>(i & a[0], a[1..]);
        s = (i ^ a[0]) . s_a
    end if
end where

cb<n> (i) = (s:[n],r) where
    if n = 1 then
        (s,r) = cm_2 (i)
    else
        c = reg ( i ^ s[0] );
        (s_a,r) = cb<n-1>(i & c);
        s = c . s_a
    end if
end where

and_n<n> (a : [n]) = o where
    if n = 1 then
        o = a[0]
    else if n = 0 then
        o = 1
    else
        o = and_n<n/2>(a[..(n/2)-1]) & and_n<n-n/2>(a[n/2..])
    end if end if
end where

nxor2_n<n> (a : [n], b : [n]) = o : [n] where
    if n = 0 then
        o = []
    else o = (a[0] ^ not b[0]) . nxor2_n<n-1> (a[1..], b[1..])
    end if
end where

eq_m1<n> (i : [n]) = b where
    b = and_n<n>(nxor2_n<n>(i,0b110111))
end where

eq_m2<n> (i : [n]) = b where
    b = and_n<n>(nxor2_n<n>(i,0b11101))
end where

cm_m_aux<n> (r,i) = s : [n] where
    if n = 0 then
        s = []
    else
        c = reg ( mux(r,c ^ i,0) );
        s = c . cm_m_aux<n-1>(r,i & c)
    end if
end where

cm_m1<n> (i) = (s:[n],r) where
    c = reg ( mux(r, i ^ c,0) );
    s = c . cm_m_aux<n-1>(r,i & c);
    r = eq_m1<n>(s) & i
end where

cm_m2<n> (i) = (s:[n],r) where
    c = reg ( mux(r, i ^ c,0) );
    s = c . cm_m_aux<n-1>(r,i & c);
    r = eq_m2<n>(s) & i
end where

main() = (secs:[6],mins:[6],hours:[5],r_d) where
    (secs,r_s) = cm_m1<6>(1);
    (mins,r_m) = cm_m1<6>(r_s);
	(hours,r_d) = cm_m2<5>(r_m);
end where