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