VexRiscvBPluginGenerator/data_sm4.txt
2021-03-06 04:39:34 -05:00

314 lines
8.3 KiB
Text

I SM4ED SM4ED --11000----------000000000110011 sm4 Zks Zksed
I SM4KS SM4KS --11010----------000000000110011 sm4 Zks Zksed
S SM4ED "fun_sm4ed(input(SRC1), input(SRC2), input(INSTRUCTION)(31 downto 30))"
S SM4KS "fun_sm4ks(input(SRC1), input(SRC2), input(INSTRUCTION)(31 downto 30))"
P """
// massive MUX implementing SM4SBOX
def fun_sm4sbox_raw(in:Bits) : Bits = {
val x = in(7 downto 0)
val r = (x).mux(
B"8'x00" -> B"8'xD6",
B"8'x01" -> B"8'x90",
B"8'x02" -> B"8'xE9",
B"8'x03" -> B"8'xFE",
B"8'x04" -> B"8'xCC",
B"8'x05" -> B"8'xE1",
B"8'x06" -> B"8'x3D",
B"8'x07" -> B"8'xB7",
B"8'x08" -> B"8'x16",
B"8'x09" -> B"8'xB6",
B"8'x0a" -> B"8'x14",
B"8'x0b" -> B"8'xC2",
B"8'x0c" -> B"8'x28",
B"8'x0d" -> B"8'xFB",
B"8'x0e" -> B"8'x2C",
B"8'x0f" -> B"8'x05",
B"8'x10" -> B"8'x2B",
B"8'x11" -> B"8'x67",
B"8'x12" -> B"8'x9A",
B"8'x13" -> B"8'x76",
B"8'x14" -> B"8'x2A",
B"8'x15" -> B"8'xBE",
B"8'x16" -> B"8'x04",
B"8'x17" -> B"8'xC3",
B"8'x18" -> B"8'xAA",
B"8'x19" -> B"8'x44",
B"8'x1a" -> B"8'x13",
B"8'x1b" -> B"8'x26",
B"8'x1c" -> B"8'x49",
B"8'x1d" -> B"8'x86",
B"8'x1e" -> B"8'x06",
B"8'x1f" -> B"8'x99",
B"8'x20" -> B"8'x9C",
B"8'x21" -> B"8'x42",
B"8'x22" -> B"8'x50",
B"8'x23" -> B"8'xF4",
B"8'x24" -> B"8'x91",
B"8'x25" -> B"8'xEF",
B"8'x26" -> B"8'x98",
B"8'x27" -> B"8'x7A",
B"8'x28" -> B"8'x33",
B"8'x29" -> B"8'x54",
B"8'x2a" -> B"8'x0B",
B"8'x2b" -> B"8'x43",
B"8'x2c" -> B"8'xED",
B"8'x2d" -> B"8'xCF",
B"8'x2e" -> B"8'xAC",
B"8'x2f" -> B"8'x62",
B"8'x30" -> B"8'xE4",
B"8'x31" -> B"8'xB3",
B"8'x32" -> B"8'x1C",
B"8'x33" -> B"8'xA9",
B"8'x34" -> B"8'xC9",
B"8'x35" -> B"8'x08",
B"8'x36" -> B"8'xE8",
B"8'x37" -> B"8'x95",
B"8'x38" -> B"8'x80",
B"8'x39" -> B"8'xDF",
B"8'x3a" -> B"8'x94",
B"8'x3b" -> B"8'xFA",
B"8'x3c" -> B"8'x75",
B"8'x3d" -> B"8'x8F",
B"8'x3e" -> B"8'x3F",
B"8'x3f" -> B"8'xA6",
B"8'x40" -> B"8'x47",
B"8'x41" -> B"8'x07",
B"8'x42" -> B"8'xA7",
B"8'x43" -> B"8'xFC",
B"8'x44" -> B"8'xF3",
B"8'x45" -> B"8'x73",
B"8'x46" -> B"8'x17",
B"8'x47" -> B"8'xBA",
B"8'x48" -> B"8'x83",
B"8'x49" -> B"8'x59",
B"8'x4a" -> B"8'x3C",
B"8'x4b" -> B"8'x19",
B"8'x4c" -> B"8'xE6",
B"8'x4d" -> B"8'x85",
B"8'x4e" -> B"8'x4F",
B"8'x4f" -> B"8'xA8",
B"8'x50" -> B"8'x68",
B"8'x51" -> B"8'x6B",
B"8'x52" -> B"8'x81",
B"8'x53" -> B"8'xB2",
B"8'x54" -> B"8'x71",
B"8'x55" -> B"8'x64",
B"8'x56" -> B"8'xDA",
B"8'x57" -> B"8'x8B",
B"8'x58" -> B"8'xF8",
B"8'x59" -> B"8'xEB",
B"8'x5a" -> B"8'x0F",
B"8'x5b" -> B"8'x4B",
B"8'x5c" -> B"8'x70",
B"8'x5d" -> B"8'x56",
B"8'x5e" -> B"8'x9D",
B"8'x5f" -> B"8'x35",
B"8'x60" -> B"8'x1E",
B"8'x61" -> B"8'x24",
B"8'x62" -> B"8'x0E",
B"8'x63" -> B"8'x5E",
B"8'x64" -> B"8'x63",
B"8'x65" -> B"8'x58",
B"8'x66" -> B"8'xD1",
B"8'x67" -> B"8'xA2",
B"8'x68" -> B"8'x25",
B"8'x69" -> B"8'x22",
B"8'x6a" -> B"8'x7C",
B"8'x6b" -> B"8'x3B",
B"8'x6c" -> B"8'x01",
B"8'x6d" -> B"8'x21",
B"8'x6e" -> B"8'x78",
B"8'x6f" -> B"8'x87",
B"8'x70" -> B"8'xD4",
B"8'x71" -> B"8'x00",
B"8'x72" -> B"8'x46",
B"8'x73" -> B"8'x57",
B"8'x74" -> B"8'x9F",
B"8'x75" -> B"8'xD3",
B"8'x76" -> B"8'x27",
B"8'x77" -> B"8'x52",
B"8'x78" -> B"8'x4C",
B"8'x79" -> B"8'x36",
B"8'x7a" -> B"8'x02",
B"8'x7b" -> B"8'xE7",
B"8'x7c" -> B"8'xA0",
B"8'x7d" -> B"8'xC4",
B"8'x7e" -> B"8'xC8",
B"8'x7f" -> B"8'x9E",
B"8'x80" -> B"8'xEA",
B"8'x81" -> B"8'xBF",
B"8'x82" -> B"8'x8A",
B"8'x83" -> B"8'xD2",
B"8'x84" -> B"8'x40",
B"8'x85" -> B"8'xC7",
B"8'x86" -> B"8'x38",
B"8'x87" -> B"8'xB5",
B"8'x88" -> B"8'xA3",
B"8'x89" -> B"8'xF7",
B"8'x8a" -> B"8'xF2",
B"8'x8b" -> B"8'xCE",
B"8'x8c" -> B"8'xF9",
B"8'x8d" -> B"8'x61",
B"8'x8e" -> B"8'x15",
B"8'x8f" -> B"8'xA1",
B"8'x90" -> B"8'xE0",
B"8'x91" -> B"8'xAE",
B"8'x92" -> B"8'x5D",
B"8'x93" -> B"8'xA4",
B"8'x94" -> B"8'x9B",
B"8'x95" -> B"8'x34",
B"8'x96" -> B"8'x1A",
B"8'x97" -> B"8'x55",
B"8'x98" -> B"8'xAD",
B"8'x99" -> B"8'x93",
B"8'x9a" -> B"8'x32",
B"8'x9b" -> B"8'x30",
B"8'x9c" -> B"8'xF5",
B"8'x9d" -> B"8'x8C",
B"8'x9e" -> B"8'xB1",
B"8'x9f" -> B"8'xE3",
B"8'xa0" -> B"8'x1D",
B"8'xa1" -> B"8'xF6",
B"8'xa2" -> B"8'xE2",
B"8'xa3" -> B"8'x2E",
B"8'xa4" -> B"8'x82",
B"8'xa5" -> B"8'x66",
B"8'xa6" -> B"8'xCA",
B"8'xa7" -> B"8'x60",
B"8'xa8" -> B"8'xC0",
B"8'xa9" -> B"8'x29",
B"8'xaa" -> B"8'x23",
B"8'xab" -> B"8'xAB",
B"8'xac" -> B"8'x0D",
B"8'xad" -> B"8'x53",
B"8'xae" -> B"8'x4E",
B"8'xaf" -> B"8'x6F",
B"8'xb0" -> B"8'xD5",
B"8'xb1" -> B"8'xDB",
B"8'xb2" -> B"8'x37",
B"8'xb3" -> B"8'x45",
B"8'xb4" -> B"8'xDE",
B"8'xb5" -> B"8'xFD",
B"8'xb6" -> B"8'x8E",
B"8'xb7" -> B"8'x2F",
B"8'xb8" -> B"8'x03",
B"8'xb9" -> B"8'xFF",
B"8'xba" -> B"8'x6A",
B"8'xbb" -> B"8'x72",
B"8'xbc" -> B"8'x6D",
B"8'xbd" -> B"8'x6C",
B"8'xbe" -> B"8'x5B",
B"8'xbf" -> B"8'x51",
B"8'xc0" -> B"8'x8D",
B"8'xc1" -> B"8'x1B",
B"8'xc2" -> B"8'xAF",
B"8'xc3" -> B"8'x92",
B"8'xc4" -> B"8'xBB",
B"8'xc5" -> B"8'xDD",
B"8'xc6" -> B"8'xBC",
B"8'xc7" -> B"8'x7F",
B"8'xc8" -> B"8'x11",
B"8'xc9" -> B"8'xD9",
B"8'xca" -> B"8'x5C",
B"8'xcb" -> B"8'x41",
B"8'xcc" -> B"8'x1F",
B"8'xcd" -> B"8'x10",
B"8'xce" -> B"8'x5A",
B"8'xcf" -> B"8'xD8",
B"8'xd0" -> B"8'x0A",
B"8'xd1" -> B"8'xC1",
B"8'xd2" -> B"8'x31",
B"8'xd3" -> B"8'x88",
B"8'xd4" -> B"8'xA5",
B"8'xd5" -> B"8'xCD",
B"8'xd6" -> B"8'x7B",
B"8'xd7" -> B"8'xBD",
B"8'xd8" -> B"8'x2D",
B"8'xd9" -> B"8'x74",
B"8'xda" -> B"8'xD0",
B"8'xdb" -> B"8'x12",
B"8'xdc" -> B"8'xB8",
B"8'xdd" -> B"8'xE5",
B"8'xde" -> B"8'xB4",
B"8'xdf" -> B"8'xB0",
B"8'xe0" -> B"8'x89",
B"8'xe1" -> B"8'x69",
B"8'xe2" -> B"8'x97",
B"8'xe3" -> B"8'x4A",
B"8'xe4" -> B"8'x0C",
B"8'xe5" -> B"8'x96",
B"8'xe6" -> B"8'x77",
B"8'xe7" -> B"8'x7E",
B"8'xe8" -> B"8'x65",
B"8'xe9" -> B"8'xB9",
B"8'xea" -> B"8'xF1",
B"8'xeb" -> B"8'x09",
B"8'xec" -> B"8'xC5",
B"8'xed" -> B"8'x6E",
B"8'xee" -> B"8'xC6",
B"8'xef" -> B"8'x84",
B"8'xf0" -> B"8'x18",
B"8'xf1" -> B"8'xF0",
B"8'xf2" -> B"8'x7D",
B"8'xf3" -> B"8'xEC",
B"8'xf4" -> B"8'x3A",
B"8'xf5" -> B"8'xDC",
B"8'xf6" -> B"8'x4D",
B"8'xf7" -> B"8'x20",
B"8'xf8" -> B"8'x79",
B"8'xf9" -> B"8'xEE",
B"8'xfa" -> B"8'x5F",
B"8'xfb" -> B"8'x3E",
B"8'xfc" -> B"8'xD7",
B"8'xfd" -> B"8'xCB",
B"8'xfe" -> B"8'x39",
B"8'xff" -> B"8'x48"
)
r // return value
}
def fun_sm4ed(rs1:Bits, rs2:Bits, sel: Bits) : Bits = {
val idx = (sel).mux(
B"2'b00" -> rs2( 7 downto 0),
B"2'b01" -> rs2(15 downto 8),
B"2'b10" -> rs2(23 downto 16),
B"2'b11" -> rs2(31 downto 24)
)
val x = fun_sm4sbox_raw(idx)
val y = x.resize(32) ^
(x << 8).resize(32) ^
(x << 2).resize(32) ^
(x << 18).resize(32) ^
((x & B"8'x3F") << 26).resize(32) ^
((x & B"8'xC0") << 10).resize(32)
val r = (sel).mux(
B"2'b00" -> y(31 downto 0),
B"2'b01" -> y(23 downto 0) ## y(31 downto 24),
B"2'b10" -> y(15 downto 0) ## y(31 downto 16),
B"2'b11" -> y( 7 downto 0) ## y(31 downto 8)
)
rs1 ^ r // return value
}
def fun_sm4ks(rs1:Bits, rs2:Bits, sel: Bits) : Bits = {
val idx = (sel).mux(
B"2'b00" -> rs2( 7 downto 0),
B"2'b01" -> rs2(15 downto 8),
B"2'b10" -> rs2(23 downto 16),
B"2'b11" -> rs2(31 downto 24)
)
val x = fun_sm4sbox_raw(idx)
val y = x.resize(32) ^
((x & B"8'x07" ) << 29).resize(32) ^
((x & B"8'xFE" ) << 7).resize(32) ^
((x & B"8'x01" ) << 23).resize(32) ^
((x & B"8'xF8" ) << 13).resize(32)
val r = (sel).mux(
B"2'b00" -> y(31 downto 0),
B"2'b01" -> y(23 downto 0) ## y(31 downto 24),
B"2'b10" -> y(15 downto 0) ## y(31 downto 16),
B"2'b11" -> y( 7 downto 0) ## y(31 downto 8)
)
rs1 ^ r // return value
}
"""