Integral unions are useful to cover cases where we have variants of data encoded in integers. One example could be CPU instructions encoded as 16-bit or 32-bit numbers.
type InstructionFormat_1 = struct uint<32> { uint<20> imm31_12; uint<5> rd; uint<7> opcode : valid_opcode_for_format_1 (opcode); }; type InstructionFormat_2 = struct uint<32> { uint<7> funct7; uint<5> rs2; uint<5> rs1; uint<3> funct3; uint<5> rd; uint<7> opcode : valid_opcode_for_format_2 (opcode); }; type Instruction = union uint<32> { InstructionFormat_1 f1; InstructionFomrat_2 f2; };
Like integral structs, integral unions can be casted to/from integers;
e.g., 3211411U as Instruction
will create an Instruction
union.
Like integral structs, integral unions can have fields of the following types: integral, offset, integral struct or union.