packages feed

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