.definition



# invalid rs2=0
c.add0 =        [1001.....1....10]
c.add1 =        [1001......1...10]
c.add2 =        [1001.......1..10]
c.add3 =        [1001........1.10]
c.add4 =        [1001.........110]

# invalid rs2=0
c.mv0 =        [1000.....1....10]
c.mv1 =        [1000......1...10]
c.mv2 =        [1000.......1..10]
c.mv3 =        [1000........1.10]
c.mv4 =        [1000.........110]


# invalid if rs1=0
c.jalr0 =       [10011....0000010]
c.jalr1 =       [1001.1...0000010]
c.jalr2 =       [1001..1..0000010]
c.jalr3 =       [1001...1.0000010]
c.jalr4 =       [1001....10000010]

c.addi  =        [000...........01]

# invalid imm=0
c.addi16sp0 =   [011100010.....01]
c.addi16sp1 =   [011.000101....01]
c.addi16sp2 =   [011.00010.1...01]
c.addi16sp3 =   [011.00010..1..01]
c.addi16sp4 =   [011.00010...1.01]
c.addi16sp5 =   [011.00010....101]

# invalid uimm=0
c.addi4spn0 =   [0001..........00]
c.addi4spn1 =   [000.1.........00]
c.addi4spn2 =   [000..1........00]
c.addi4spn3 =   [000...1.......00]
c.addi4spn4 =   [000....1......00]
c.addi4spn5 =   [000.....1.....00]
c.addi4spn6 =   [000......1....00]
c.addi4spn7 =   [000.......1...00]


c.and =         [100011...11...01]
c.andi =        [100.10........01]
c.beqz =        [110...........01]
c.bnez =        [111...........01]
c.ebreak =      [1001000000000010]
c.j =           [101...........01]
c.jal =         [001...........01]


c.jr0 =                 [10001....0000010]
c.jr1 =                 [1000.1...0000010]
c.jr2 =                 [1000..1..0000010]
c.jr3 =                 [1000...1.0000010]
c.jr4 =                 [1000....10000010]

c.li =           [010...........01]

# invalid rd=x2 or imm=0
c.lui0 =                [01111.........01]
c.lui1 =                [0111.1........01]
c.lui2 =                [0111..1.......01]
c.lui3 =                [0111...0......01]
c.lui4 =                [0111....1.....01]
c.lui5 =                [011.1....1....01]
c.lui6 =                [011..1...1....01]
c.lui7 =                [011...1..1....01]
c.lui8 =                [011....0.1....01]
c.lui9 =                [011.....11....01]
c.lui10=                [011.1.....1...01]
c.lui11=                [011..1....1...01]
c.lui12 =               [011...1...1...01]
c.lui13 =               [011....0..1...01]
c.lui14 =               [011.....1.1...01]
c.lui15 =               [011.1......1..01]
c.lui16 =               [011..1.....1..01]
c.lui17 =               [011...1....1..01]
c.lui18 =               [011....0...1..01]
c.lui19 =               [011.....1..1..01]
c.lui20 =               [011.1.......1.01]
c.lui21 =               [011..1......1.01]
c.lui22 =               [011...1.....1.01]
c.lui23 =               [011....0....1.01]
c.lui24 =               [011.....1...1.01]
c.lui25 =               [011.1........101]
c.lui26 =               [011..1.......101]
c.lui27 =               [011...1......101]
c.lui28 =               [011....0.....101]
c.lui29 =               [011.....1....101]


c.lw =          [010...........00]


c.lwsp =        [010...........10]

c.or =          [100011...10...01]

# bit 5 of the shift must be 0 to be legal
c.slli =        [0000..........10]

c.srai =        [100001........01]

c.srli =        [100000........01]

c.sub =         [100011...00...01]
c.sw =          [110...........00]
c.swsp =        [110...........10]
c.xor =         [100011...01...01]


.input
rv32c = {
        i[15]
        i[14]
        i[13]
        i[12]
        i[11]
        i[10]
        i[9]
        i[8]
        i[7]
        i[6]
        i[5]
        i[4]
        i[3]
        i[2]
        i[1]
        i[0]
}

.output
rv32c = {
        rdrd
        rdrs1
        rs2rs2
        rdprd
        rdprs1
        rs2prs2
        rs2prd
        uimm9_2
        ulwimm6_2
        ulwspimm7_2
        rdeq2
        rdeq1
        rs1eq2
        sbroffset8_1
        simm9_4
        simm5_0
        sjaloffset11_1
        sluimm17_12
        uimm5_0
        uswimm6_2
        uswspimm7_2
        o[31]
        o[30]
        o[29]
        o[28]
        o[27]
        o[26]
        o[25]
        o[24]
        o[23]
        o[22]
        o[21]
        o[20]
        o[19]
        o[18]
        o[17]
        o[16]
        o[15]
        o[14]
        o[13]
        o[12]
        o[11]
        o[10]
        o[9]
        o[8]
        o[7]
        o[6]
        o[5]
        o[4]
        o[3]
        o[2]
        o[1]
        o[0]
      }

#  assign rs2d[4:0] = i[6:2];
#
#   assign rdd[4:0] = i[11:7];
#
#   assign rdpd[4:0] = {2'b01, i[9:7]};
#
#   assign rs2pd[4:0] = {2'b01, i[4:2]};

.decode




rv32c[c.add{0-4}] =             { rdrd rdrs1 rs2rs2                                    o[5] o[4] o[1] o[0] }

rv32c[c.mv{0-4}] =              { rdrd rs2rs2                                          o[5] o[4] o[1] o[0] }

rv32c[c.addi] =                 { rdrd rdrs1 simm5_0                                          o[4] o[1] o[0] }

rv32c[c.addi16sp{0-5}] =        { rdeq2 rs1eq2 simm9_4                                        o[4] o[1] o[0] }
rv32c[c.addi4spn{0-7}] =        { rs2prd rs1eq2 uimm9_2                                         o[4] o[1] o[0] }


rv32c[c.and] =                  { rdprd rdprs1 rs2prs2          o[14] o[13] o[12]      o[5] o[4] o[1] o[0] }
rv32c[c.andi] =                 { rdprd rdprs1 simm5_0            o[14] o[13] o[12]           o[4] o[1] o[0] }
rv32c[c.beqz] =                 { rdprs1 sbroffset8_1                                o[6] o[5]      o[1] o[0] }
rv32c[c.bnez] =                 { rdprs1 sbroffset8_1                          o[12] o[6] o[5]      o[1] o[0] }


rv32c[c.ebreak] =               {                            o[20]                o[6] o[5] o[4] o[1] o[0] }

rv32c[c.j] =                    { sjaloffset11_1                                            o[6] o[5]      o[3] o[2] o[1] o[0] }
rv32c[c.jal] =                  { sjaloffset11_1 rdeq1                                      o[6] o[5]      o[3] o[2] o[1] o[0] }


rv32c[c.jalr{0-4}] =            { rdeq1 rdrs1                                           o[6] o[5]           o[2] o[1] o[0] }
rv32c[c.jr{0-4}] =              {       rdrs1                                           o[6] o[5]           o[2] o[1] o[0] }
rv32c[c.li] =                   { rdrd simm5_0                                               o[4]           o[1] o[0] }

rv32c[c.lui{0-29}] =            { rdrd sluimm17_12                                                o[5] o[4]      o[2] o[1] o[0] }
rv32c[c.lw] =                   { rs2prd rdprs1 ulwimm6_2                    o[13]                                 o[1] o[0] }
rv32c[c.lwsp] =                 { rdrd rs1eq2 ulwspimm7_2                    o[13]                                 o[1] o[0] }


rv32c[c.or] =                   { rdprd rdprs1 rs2prs2               o[14] o[13]             o[5] o[4] o[1] o[0] }

rv32c[c.slli] =            { rdrd rdrs1 uimm5_0                               o[12]            o[4] o[1] o[0] }
rv32c[c.srai] =           { rdprd rdprs1 uimm5_0          o[30] o[14]        o[12]            o[4] o[1] o[0] }
rv32c[c.srli] =            { rdprd rdprs1 uimm5_0                o[14]        o[12]            o[4] o[1] o[0] }


rv32c[c.sub] =                  { rdprd rdprs1 rs2prs2        o[30]                          o[5] o[4] o[1] o[0] }
rv32c[c.sw] =                   { rdprs1 rs2prs2 uswimm6_2                   o[13]             o[5]      o[1] o[0] }
rv32c[c.swsp] =                 { rs2rs2 rs1eq2  uswspimm7_2                 o[13]             o[5]      o[1] o[0] }
rv32c[c.xor] =                  { rdprd rdprs1 rs2prs2              o[14]                    o[5] o[4] o[1] o[0] }



.end