diff options
| author | bd <bdunahu@operationnull.com> | 2025-03-28 18:10:14 -0400 | 
|---|---|---|
| committer | bd <bdunahu@operationnull.com> | 2025-03-28 18:10:14 -0400 | 
| commit | 136417edd709f0e2d30931d222b658ff7dd9a5a8 (patch) | |
| tree | 7ecf0837278e46146360134bb43252357acfe494 /tests | |
| parent | ab6d02361b04a18b7823aef0ff1cb0ff2a215ec2 (diff) | |
add get_instr_fields func to parse instruction fields from raw bits
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/utils.cc | 116 | 
1 files changed, 112 insertions, 4 deletions
diff --git a/tests/utils.cc b/tests/utils.cc index ea1a1ed..6c72694 100644 --- a/tests/utils.cc +++ b/tests/utils.cc @@ -2,26 +2,134 @@  #include "definitions.h"  #include <catch2/catch_test_macros.hpp> -TEST_CASE("Parse arbitrary fields # one", "[cache]") +TEST_CASE("Parse arbitrary fields # one", "[utils]")  {  	int tag, index, offset;  	int address = 0b0001010101; -	get_bit_fields(address, &tag, &index, &offset); +	get_cache_fields(address, &tag, &index, &offset);  	CHECK(tag == 0b000);  	CHECK(index == 0b10101);  	CHECK(offset == 0b01);  } -TEST_CASE("Parse arbitrary fields # two", "[cache]") +TEST_CASE("Parse arbitrary fields # two", "[utils]")  {  	int tag, index, offset;  	int address = 0b0100111011; -	get_bit_fields(address, &tag, &index, &offset); +	get_cache_fields(address, &tag, &index, &offset);  	CHECK(tag == 0b010);  	CHECK(index == 0b01110);  	CHECK(offset == 0b11);  } +TEST_CASE("Parse invalid type", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0x00FF00FF; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b11); +	// behavior does nothing +	CHECK(s1 == 0x00FF00FF); +	CHECK(s2 == 0b0); +	CHECK(s3 == 0b0); +	CHECK(opcode == 0b0); +} + +TEST_CASE("Parse arbitrary r-type # one", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0xCCCCCCCC; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b00); +	CHECK(s1 == 0b11001); +	CHECK(s2 == 0b01100); +	CHECK(s3 == 0b00110); +	CHECK(opcode == 0b10011); +} + +TEST_CASE("Parse arbitrary r-type # two", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0x99AABBCC; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b00); +	CHECK(s1 == 0b10111); +	CHECK(s2 == 0b01011); +	CHECK(s3 == 0b10101); +	CHECK(opcode == 0b10011); +} + +TEST_CASE("Parse arbitrary i-type # one", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0xDDDDDDDD; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b01); +	CHECK(s1 == 0b10111); +	CHECK(s2 == 0b11011); +	CHECK(s3 == 0xDDDD); +	CHECK(opcode == 0b0111); +} + +TEST_CASE("Parse arbitrary i-type # two", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0xAABBCCDD; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b01); +	CHECK(s1 == 0b10011); +	CHECK(s2 == 0b11001); +	CHECK(s3 == 0xAABB); +	CHECK(opcode == 0b0111); +} + +TEST_CASE("Parse arbitrary j-type # one", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0xEEEEEEEE; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b10); +	CHECK(s1 == 0b11011); +	CHECK(s2 == 0b111011101110111011101);	 +	CHECK(opcode == 0b1011); +	// behavior does nothing +	CHECK(s3 == 0b0); +} + +TEST_CASE("Parse arbitrary j-type # two", "[utils]") +{ +	signed int s1 = 0, s2 = 0, s3 = 0; +	unsigned int type = 0, opcode = 0; + +	s1 = 0xBBCCDDEE; +	get_instr_fields(s1, s2, s3, type, opcode); + +	REQUIRE(type == 0b10); +	CHECK(s1 == 0b10111); +	CHECK(s2 == 0b101110111100110011011);	 +	CHECK(opcode == 0b1011); +	// behavior does nothing +	CHECK(s3 == 0b0); +} +  TEST_CASE("wrap address outside upper bound", "[utils]")  {  	int address = MEM_WORDS + 25;  | 
