Wired-0.2.2: Examples/Sklansky.hs
import "Wired" Lava.Patterns
import Wired
import Libs.Nangate45.Wired
import Analysis.Timing
import Export.DEF
bus = rightwards . mapM bus1
where
bus1 = space 402e-9 >=> guide 2 0 >=> space 358e-9
sklansky op [a] = space 760e-9 [a]
sklansky op as = downwards' $ do
bus as
(ls',rs') <- rightwards $ ((skl -|- skl) . halveList) as
rs'' <- rightwards $ sequence [op (last ls', r) | r <- rs']
bus (ls' ++ rs'')
where
skl = sklansky (flipY . op)
-- Using downwards' to get alignment towards the right.
sklanskyCrit op [a] = space 760e-9 [a]
sklanskyCrit op as = downwards' $ do
bus as
(ls',rs') <- rightwards $ ((sklC -|- skl) . halveList) as
rs'' <- rightwards $ sequence [op (last ls', r) | r <- rs']
label "critical" (last ls')
bus (ls' ++ rs'')
where
sklC = sklanskyCrit (flipY . op)
skl = sklansky (flipY . op)
-- Using downwards' to get alignment towards the right.
r = result (rowHeight :: Res Nangate45 Length)
sklanskyIO op = downwards .
( bus
->- space r
->- sklanskyCrit op
->- space r
->- bus
)
test1 = renderWiredWithNets "circ" $ sklanskyIO and2_x2 =<< inputList 16
test2 = simulate (sklansky and2_x2) [1,1,1,1,0,1,1,0,1,1]
test3 = maximum $ fst $ analyzeTimingW $ sklanskyIO and2_x2 =<< inputList 16
test4 = exportDEF "sklansky" $ sklanskyIO and2_x2 =<< inputList 16
test5 = lookupTag "critical" $ fanout $ sklanskyIO and2_x2 =<< inputList 16
test6 = lookupTag "critical" $ snd $ analyzeTimingW $ sklanskyIO and2_x2 =<< inputList 16