概要
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);
}