概要
www.oreilly.co.jp 課題を実装するにあたって、本質的じゃない部分(ハードウェアシミュレータの使い方)でハマることがあったのでメモ。
バス
ピンで多ビットを表現する場合は以下のように記述する。
CHIP Test { IN in[16]; // 0000 0000 0000 0011 PARTS: // 配列のような記法で多ビットの一部を入力に指定できる。この例の場合 a=1, b=1 になる Or(a=in[0], b=in[1], out=a); // 範囲指定も可能 Or8Way(in=in[0..7], out=b); // 出力も範囲指定できる。こうすることで、16ビットの出力を8ビット×2の出力に分割することが可能 Or16(a=in, b=in, out[0..7]=c, out[8..15]=d); }
ハードウェアシミュレータ上での多ビットの入力値の指定方法
2進数では指定できないので、10進数に変換した数値を指定する。
0000 1111
を入力したい場合の例
また、値は補数表現として解釈される。 例えば、1111 1111 1111 1111
を入力したい場合は 65535
ではなく -1
を指定する。
その他のルール
出力ピンは入力に指定できない
以下のようなことをしようとするとエラーになる。
CHIP Test { IN in[16]; OUT out1, out2; PARTS: Or(a=true, b=true, out=out1); Or(a=out1, b=false, out=out2); }
同じことをしたい場合、複数のピンに同じ値を出力すればよい。
CHIP Test { IN in[16]; OUT out1, out2; PARTS: Or(a=true, b=false, out=out1, out=iout); Or(a=iout, b=false, out=out2); }
内部ピンのバスは参照できない
以下のようなことをしようとするとエラーになる。
CHIP Test { IN in[16]; OUT out; PARTS: Or16(a=in, b=in, out=a); Or(a=a[0], b=a[1], out=out); }
使いたい桁数にあらかじめ分割しておけばOK。
CHIP Test { IN in[16]; OUT out; PARTS: Or16(a=in, b=in, out[0]=a, out[1]=b); Or(a=a, b=b, out=out); }