public void Should_SerializeUInt5() { UInt5 value = UInt5.MaxValue; // range 0 to 31 Assert.AreEqual(1, value.GetBit(0)); Assert.AreEqual(1, value.GetBit(1)); Assert.AreEqual(1, value.GetBit(2)); Assert.AreEqual(1, value.GetBit(3)); Assert.AreEqual(1, value.GetBit(4)); Assert.AreEqual(new Bit[] { 1, 1, 1, 1, 1 }, value.GetBits()); value = (UInt5)2; Assert.AreEqual(0, value.GetBit(0)); Assert.AreEqual(1, value.GetBit(1)); Assert.AreEqual(0, value.GetBit(2)); Assert.AreEqual(0, value.GetBit(3)); Assert.AreEqual(0, value.GetBit(4)); Assert.AreEqual(new Bit[] { 0, 1, 0, 0, 0 }, value.GetBits()); // test overflow value = (UInt5)36; Assert.AreEqual(4, value); Assert.AreEqual(0, value.GetBit(0)); Assert.AreEqual(0, value.GetBit(1)); Assert.AreEqual(1, value.GetBit(2)); Assert.AreEqual(0, value.GetBit(3)); Assert.AreEqual(0, value.GetBit(4)); Assert.AreEqual(new Bit[] { 0, 0, 1, 0, 0 }, value.GetBits()); }
protected override void OnTick() // TODO mere manuel { switch (format.val) { case InstructionFormat.i: imm.val = (int)imm12.val; break; case InstructionFormat.s: imm.val = (int)((imm7.val << 5) | (imm5.val)); break; case InstructionFormat.b: { int eleven = imm5.val & 1; UInt5 fourone = (UInt5)(imm5.val & 0b11110); int twelve = imm7.val >> 6 & 1; UInt6 tenfive = (UInt6)(imm7.val & 0b0111111); imm.val = (int)((twelve == 1 ? 0 : unchecked ((int)0xFFFFF000)) | (eleven << 11) | (tenfive << 5) | fourone); }; break; case InstructionFormat.u: imm.val = (int)(imm20.val << 12); break; case InstructionFormat.j: { int twenty = (int)((imm20.val >> 19) & 1); int tenone = (int)((imm20.val >> 9) & 0x1FF); int eleven = (int)((imm20.val >> 8) & 1); int nineteentwelve = (int)((imm20.val) & 0b11111111); imm.val = (int)((twenty == 1 ? 0 : unchecked ((int)0xFFF00000)) | (nineteentwelve << 12) | (eleven << 11) | (tenone << 1) ); }; break; default: imm.val = 0; break; } }