| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -36,14 +36,14 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        constant major_decode_rom_array : major_rom_array_t := (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						--          unit     internal      in1         in2          in3   out   CR   CR   inv  inv  cry   cry  ldst  BR   sgn  upd  rsrv 32b  sgn  rc    lk   sgl
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						--                        op                                            in   out   A   out  in    out  len        ext                                 pipe
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						12 =>       (ALU,    OP_ADD,       RA,         CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- addic
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						13 =>       (ALU,    OP_ADD,       RA,         CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', ONE,  '0', '1'), -- addic.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						12 =>       (ALU,    OP_ADD,       RA,         CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- addic
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						13 =>       (ALU,    OP_ADD,       RA,         CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', ONE,  '0', '0'), -- addic.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                14 =>       (ALU,    OP_ADD,       RA_OR_ZERO, CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- addi
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						15 =>       (ALU,    OP_ADD,       RA_OR_ZERO, CONST_SI_HI, NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- addis
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						28 =>       (ALU,    OP_AND,       NONE,       CONST_UI,    RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', ONE,  '0', '0'), -- andi.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						29 =>       (ALU,    OP_AND,       NONE,       CONST_UI_HI, RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', ONE,  '0', '0'), -- andis.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						18 =>       (ALU,    OP_B,         NONE,       CONST_LI,    NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'), -- b
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						16 =>       (ALU,    OP_BC,        NONE,       CONST_BD,    NONE, NONE, '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'), -- bc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						16 =>       (ALU,    OP_BC,        SPR,        CONST_BD,    NONE, SPR , '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'), -- bc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						11 =>       (ALU,    OP_CMP,       RA,         CONST_SI,    NONE, NONE, '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- cmpi
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						10 =>       (ALU,    OP_CMPL,      RA,         CONST_UI,    NONE, NONE, '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- cmpli
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						34 =>       (LDST,   OP_LOAD,      RA_OR_ZERO, CONST_SI,    NONE, RT,   '0', '0', '0', '0', ZERO, '0', is1B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- lbz
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -106,7 +106,7 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- addpcis not implemented yet
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#001#    =>       (ALU,    OP_ILLEGAL,   NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                -- bclr, bcctr, bctar
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#100#    =>       (ALU,    OP_BCREG,     NONE,       NONE,        NONE, NONE, '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '1'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#100#    =>       (ALU,    OP_BCREG,     SPR,        SPR,         NONE, SPR,  '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '1', '0'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                -- isync
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#111#    =>       (ALU,    OP_ISYNC,     NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						others   => illegal_inst
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -133,10 +133,15 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						--                       unit    internal      in1         in2          in3   out   CR   CR   inv  inv  cry   cry  ldst  BR   sgn  upd  rsrv 32b  sgn  rc    lk   sgl
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						--                                    op                                            in   out   A   out  in    out  len        ext                                 pipe
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0100001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- add
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- addc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- adde
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011101010#  =>       (ALU,    OP_ADD,       RA,         CONST_M1,    NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- addme
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011001010#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- addze
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1100001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1000001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addco
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- adde
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1010001010#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011101010#  =>       (ALU,    OP_ADD,       RA,         CONST_M1,    NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addme
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1011101010#  =>       (ALU,    OP_ADD,       RA,         CONST_M1,    NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addmeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011001010#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addze
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1011001010#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '0', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- addzeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000011100#  =>       (ALU,    OP_AND,       NONE,       RB,          RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- and
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000111100#  =>       (ALU,    OP_AND,       NONE,       RB,          RS,   RA,   '0', '0', '1', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- andc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- 2#0011111100# bperm
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -156,13 +161,21 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011110110#  =>       (ALU,    OP_NOP,       NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- dcbtst
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- 2#1111110110# dcbz
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0110001001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divdeu
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1110001001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divdeuo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0110001011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divweu
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1110001011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divweuo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0110101001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divde
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1110101001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divdeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0110101011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divwe
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1110101011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divweo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111001001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divdu
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1111001001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divduo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111001011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divwu
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1111001011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divwuo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111101001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divd
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1111101001#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divdo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111101011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divw
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1111101011#  =>       (DIV,    OP_DIV,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- divwo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0100011100#  =>       (ALU,    OP_XOR,       NONE,       RB,          RS,   RA,   '0', '0', '0', '1', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- eqv
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1110111010#  =>       (ALU,    OP_EXTS,      NONE,       NONE,        RS,   RA,   '0', '0', '0', '0', ZERO, '0', is1B, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- extsb
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1110011010#  =>       (ALU,    OP_EXTS,      NONE,       NONE,        RS,   RA,   '0', '0', '0', '0', ZERO, '0', is2B, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- extsh
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -224,13 +237,13 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- 2#1000000000# mcrxr
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- 2#1001000000# mcrxrx
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000010011#  =>       (ALU,    OP_MFCR,      NONE,       NONE,        NONE, RT,   '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mfcr/mfocrf
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0101010011#  =>       (ALU,    OP_MFSPR,     NONE,       NONE,        NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- mfspr
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0101010011#  =>       (ALU,    OP_MFSPR,     SPR,        NONE,        NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mfspr
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0100001001#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- modud
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0100001011#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- moduw
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1100001001#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- modsd
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1100001011#  =>       (DIV,    OP_MOD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- modsw
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010010000#  =>       (ALU,    OP_MTCRF,     NONE,       NONE,        RS,   NONE, '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mtcrf/mtocrf
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111010011#  =>       (ALU,    OP_MTSPR,     NONE,       NONE,        RS,   NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- mtspr
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111010011#  =>       (ALU,    OP_MTSPR,     NONE,       NONE,        RS,   SPR,  '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- mtspr
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0001001001#  =>       (MUL,    OP_MUL_H64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '1', RC,   '0', '1'), -- mulhd
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000001001#  =>       (MUL,    OP_MUL_H64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- mulhdu
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0001001011#  =>       (MUL,    OP_MUL_H32,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '1', '1', RC,   '0', '1'), -- mulhw
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -241,9 +254,12 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1001001011#  =>       (MUL,    OP_MUL_H32,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '1', '1', RC,   '0', '1'), -- mulhw
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1000001011#  =>       (MUL,    OP_MUL_H32,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '1', '0', RC,   '0', '1'), -- mulhwu
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011101001#  =>       (MUL,    OP_MUL_L64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '1', RC,   '0', '1'), -- mulld
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1011101001#  =>       (MUL,    OP_MUL_L64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '1', RC,   '0', '1'), -- mulldo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011101011#  =>       (MUL,    OP_MUL_L64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '1', '1', RC,   '0', '1'), -- mullw
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1011101011#  =>       (MUL,    OP_MUL_L64,   RA,         RB,          NONE, RT,   '0', '1', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '1', '1', RC,   '0', '1'), -- mullwo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0111011100#  =>       (ALU,    OP_AND,       NONE,       RB,          RS,   RA,   '0', '0', '0', '1', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- nand
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0001101000#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '1', '0', ONE,  '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- neg
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1001101000#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '1', '0', ONE,  '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- nego
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0001111100#  =>       (ALU,    OP_OR,        NONE,       RB,          RS,   RA,   '0', '0', '0', '1', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- nor
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0110111100#  =>       (ALU,    OP_OR,        NONE,       RB,          RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- or
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0110011100#  =>       (ALU,    OP_OR,        NONE,       RB,          RS,   RA,   '0', '0', '1', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- orc
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -278,10 +294,15 @@ architecture behaviour of decode1 is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010110111#  =>       (LDST,   OP_STORE,     RA_OR_ZERO, RB,          RS,   NONE, '0', '0', '0', '0', ZERO, '0', is4B, '0', '0', '1', '0', '0', '0', NONE, '0', '1'), -- stwux
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010010111#  =>       (LDST,   OP_STORE,     RA_OR_ZERO, RB,          RS,   NONE, '0', '0', '0', '0', ZERO, '0', is4B, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- stwx
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000101000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', ONE,  '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subf
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000001000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', ONE,  '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- subfc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010001000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- subfe
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011101000#  =>       (ALU,    OP_ADD,       RA,         CONST_M1,    NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- subfme
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011001000#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '1'), -- subfze
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1000101000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', ONE,  '0', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000001000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', ONE,  '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1000001000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', ONE,  '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfco
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0010001000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfe
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1010001000#  =>       (ALU,    OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011101000#  =>       (ALU,    OP_ADD,       RA,         CONST_M1,    NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfme
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1011101000#  =>       (ALU,    OP_ADD,       RA,         CONST_M1,    NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfmeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0011001000#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfze
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1011001000#  =>       (ALU,    OP_ADD,       RA,         NONE,        NONE, RT,   '0', '0', '1', '0', CA,   '1', NONE, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- subfzeo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#1001010110#  =>       (ALU,    OP_NOP,       NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- sync
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- 2#0001000100# td
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						2#0000000100#  =>       (ALU,    OP_TW,        RA,         RB,          NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- tw
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -334,6 +355,8 @@ begin
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						v.nia  := f_in.nia;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						v.insn := f_in.insn;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						v.stop_mark := f_in.stop_mark;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						v.ispr1 := (others => '0');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						v.ispr2 := (others => '0');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if f_in.valid = '1' then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							report "Decode insn " & to_hstring(f_in.insn) & " at " & to_hstring(f_in.nia);
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -377,6 +400,33 @@ begin
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                        v.decode := major_decode_rom_array(to_integer(majorop));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						end if;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						-- Set ISPR1/ISPR2 when needed
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if v.decode.insn_type = OP_BC or v.decode.insn_type = OP_BCREG then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    -- Branch uses CTR as condition when BO(2) is 0. This is
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    -- also used to indicate that CTR is modified (they go
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    -- together).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    --
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    if f_in.insn(23) = '0' then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							v.ispr1 := fast_spr_num(SPR_CTR);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    end if;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    -- Branch source register is an SPR
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    if v.decode.insn_type = OP_BCREG then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							-- TODO: Add TAR
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							if f_in.insn(10) = '0' then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							    v.ispr2 := fast_spr_num(SPR_LR);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							else
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							    v.ispr2 := fast_spr_num(SPR_CTR);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							end if;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    end if;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						elsif v.decode.insn_type = OP_MFSPR or v.decode.insn_type = OP_MTSPR then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    v.ispr1 := fast_spr_num(decode_spr_num(f_in.insn));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    -- Make slow SPRs single issue
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    if is_fast_spr(v.ispr1) = '0' then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							v.decode.sgl_pipe := '1';
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						    end if;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						end if;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if flush_in = '1' then
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							v.valid := '0';
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						end if;
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |