xilinx-lava-5.0.1.5 を使用。 実行プログラムなので Main モジュールを宣言する。 Lava と、論理を実装したモジュールを適当にインポートする。 ここでは Virtex6 を選択。 (Xilinx Lava には Virtex[2456] が用意されている) > module Main > where > import Lava > import Lava.Virtex6 論理回路の出力の型が、Out というモナドになっているので、それに合わせて 型を修正。関数の記述を where で羅列するスタイルから do 記法に変更。 > oneBitAdder :: (Bit, (Bit, Bit)) -> Out (Bit, Bit) > oneBitAdder (cin, (a, b)) > = do > part_sum <- xor2 (a, b) > sum <- xorcy (part_sum, cin) > cout <- muxcy (part_sum, (a, cin)) > return (sum, cout) 回路記述のトップレベルの型は Out () 型である。また、配布されている ドキュメント中のコードで使っている inputBit や outputBit という関数は、 型を引数として与えるような inputPort と outputPort にリファクタリング されているので、それらを使うように変更。 > oneBitAdderCircuit :: Out () > oneBitAdderCircuit > = do > a <- inputPort "a" BitType > b <- inputPort "b" BitType > cin <- inputPort "cin" BitType > (sum, cout) <- oneBitAdder (cin, (a, b)) > outputPort "sum" BitType sum > outputPort "cout" BitType cout 論理合成をして EDIF と VHDL を出力する main である。 論理合成の関数はモナド型から通常の関数に変更されている。第 2 引数では 使用する FPGA のテクノロジを指定するようだが、import と同じものを指定 (でよいのだと思われる)。 VHDL 出力と EDIF 出力はそれぞれ別の関数になっているので、それぞれ別々に 実行している。 > main :: IO () > main > = do let nl = computeNetlist "tutrial1" Virtex6 oneBitAdderCircuit > putXilinxVHDL nl > putXilinxEDIF nl