Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.36 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6.  
  7. /*
  8.  * File:   main_v2.c
  9.  * Author: AslakV
  10.  *
  11.  * Created on 16. november 2017, 13:50
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16.  
  17. #define MAX_PROGRAM_SIZE 1000000
  18.  
  19. static int reg[32];
  20. /*
  21. static int progr[] = {
  22.     // As minimal RISC-V assembler example
  23.     0x00200093, // addi x1 x0 2
  24.     0x00300113, // addi x2 x0 3
  25.     0x002081b3, // add x3 x1 x2
  26. };
  27. */
  28.  
  29. // int progrLenght = sizeof (progr) / sizeof (progr[0]);
  30.  
  31. int main(int argc, char *argv[]) {
  32.  
  33.     static int PC = 0;
  34.  
  35.     FILE *fp;
  36.     int program_done = 0;
  37.     unsigned int progr[MAX_PROGRAM_SIZE];
  38. //    unsigned int rd, rs1, rs2;
  39.     unsigned int progrLenght = 0;
  40.  
  41.     if(argc == 2){
  42.         fp = fopen(argv[1], "r");   // Set pointer to file referenced by argv
  43.        
  44.         // Load content of the input file into an array
  45.         while(!program_done){
  46.             fread(&progr[progrLenght], 4, 1, fp);   // (ptr to dist, wordsize, # of words, file ptr)
  47.             if(progr[progrLenght] == 0x00000073 || progrLenght > 50){     // DEBUG: (instruction_count < 20)
  48.                 program_done = 1;
  49.             }
  50.             progrLenght++;
  51.         }
  52.         program_done = 0;
  53.         fclose(fp);     // Close file pointer
  54.  
  55.         // DEBUG: Read content of array  
  56.         printf("instruction count: %u \n", progrLenght);
  57.         for(unsigned int i = 0 ; i < progrLenght ; i++){
  58.             printf("%#.8x\n", progr[i]);
  59.         }
  60.     }else{
  61.         printf("Too few or too many args \n");
  62.     }
  63.  
  64.  
  65.     while (PC < progrLenght) {
  66.         int instr = progr[PC];
  67.         int opcode = instr & 0b01111111;
  68.         int rd = (instr >> 7) & 0x01f;
  69.         int func3 = (instr >> 12) & 0b111; // >>10
  70.         int rs1 = (instr >> 15) & 0x01f;
  71.         int rs2 = (instr >> 20) & 0x01f;
  72.         int rs1_l = reg[rs1];
  73.         int rs2_l = reg[rs2]; // local register values
  74.         int i_imm = (instr >> 20); // immidiate is bit 0 to
  75.         int u_imm = (instr >> 12); // *add bitmask*
  76.  
  77.         int func6 = (i_imm >> 5); // i_imm >>6
  78.         int func7 = (i_imm >> 6); // i_imm >>7
  79.  
  80.         printf("\nPC: %u \t opcode: %u \t func3: %u \t func6: %u \t func7: %u \n", PC, opcode, func3, func6, func7);
  81.  
  82.         switch (opcode) {
  83.             case 0b0110011: // R-type
  84. //            printf("\n\nR TYPE\n\n");
  85.                 switch (func3) {
  86.                     case 0b000: // add, sub
  87.                         switch (func7) {
  88.                             case 0b0000000: // add
  89.                                 reg[rd] = reg[rs1] + reg[rs2];
  90.                                 break;
  91.                             case 0b0100000: // sub
  92.                                 reg[rd] = reg[rs1] - reg[rs2];
  93.                                 break;
  94.                             default:
  95.                                 printf("\n ERROR, R-type func7 can't be %d \n", func7);
  96.                                 break;
  97.                         }
  98.                         break;
  99.                     case 0b001: // sll
  100.                         reg[rd] = (reg[rs1] << reg[rs2]); // arit og logisk bør være ens
  101.                         break;
  102.                     case 0b100: // xor
  103.                         reg[rd] = reg[rs1] ^ reg[rs2];
  104.                         break;
  105.                     case 0b101: // srl, sra
  106.                         switch (func7) {
  107.                             case 0b0000000: // srl
  108.                                 while (rs2_l--) {
  109.                                     rs1_l = (rs1_l >> 1) & 0x7FFFFFFF;
  110.                                 }
  111.                                 reg[rd] = rs1_l;
  112.                                 break;
  113.                             case 0b0100000: // sra
  114.  
  115.                                 if (rs1_l & 0x80000000 == 0x80000000) { // if MSB = 1
  116.                                     while (rs2_l--) {
  117.                                         rs1_l = (rs1_l >> 1) & 0x7FFFFFFF;
  118.                                     }
  119.                                 } else { // if MSB = 0
  120.                                     while (rs2_l--) {
  121.                                         rs1_l = (rs1_l >> 1) | 0x80000000;
  122.                                     }
  123.                                 }
  124.                                 reg[rd] = rs1_l;
  125.                                 break;
  126.                             default:
  127.                                 printf("\n ERROR, R-type func7 can't be %d \n", func7);
  128.                                 break;
  129.                         }
  130.                     case 0b110: // or
  131.                         reg[rd] = reg[rs1] | reg[rs2];
  132.                         break;
  133.                     case 0b111: // and
  134.                         reg[rd] = reg[rs1] & reg[rs2];
  135.                         break;
  136.                     default:
  137.                         printf("\n ERROR, opcode can't be %d \n", opcode);
  138.                         break;
  139.                 }
  140.                 break;
  141.  
  142.  
  143.  
  144.  
  145.             case 0b0000011: // i-type
  146.                 switch (func3) {
  147.                     case 000: //lb
  148.  
  149.                         break;
  150.                     case 001: //lh
  151.  
  152.                         break;
  153.                     case 0b010: //lw
  154.  
  155.                         break;
  156.                     case 0b011: //ld
  157.  
  158.                         break;
  159.                     case 0b100: //lbu
  160.  
  161.                         break;
  162.                     case 0b101: //lhu
  163.  
  164.                         break;
  165.                     case 0b110: //lwu
  166.  
  167.                         break;
  168.                     default:
  169.                         printf("\n ERROR, I-type (1) func3 can't be %d \n", func3);
  170.                         break;
  171.                 }
  172.  
  173.             case 0b0010011: // i-type
  174.                 switch (func3) {
  175.                     case 0b000: // addi
  176.                         reg[rd] = reg[rs1] + i_imm;
  177.                         break;
  178.                     case 0b001: //slli
  179.                         reg[rd] = (reg[rs1] << i_imm);
  180.                         break;
  181.                     case 0b100: //xori
  182.                         reg[rd] = reg[rs1] ^ i_imm;
  183.                         break;
  184.                     case 0b101: //srli, srai
  185.                         i_imm = (i_imm & 0b000000111111); // remove func6 from imm
  186.                         if (func6 == 0) {   // srli
  187.                             while (i_imm--) {
  188.                                 rs1_l = (rs1_l >> 1) & 0x7FFFFFFF;
  189.                             }
  190.                             reg[rd] = rs1_l;
  191.                         } else if (func6 == 0b100000) { // srai
  192.  
  193.                            if (rs1_l & 0x80000000 == 0x80000000) { // if MSB = 1
  194.                                 while (i_imm--) {
  195.                                     rs1_l = (rs1_l >> 1) & 0x7FFFFFFF;
  196.                                 }
  197.                             } else { // if MSB = 0
  198.                                 while (i_imm--) {
  199.                                     rs1_l = (rs1_l >> 1) | 0x80000000;
  200.                                 }
  201.                             }
  202.                             reg[rd] = rs1_l;
  203.                         } else {
  204.                             printf("\n ERROR, I-type func6 can't be %d \n", func6);
  205.                         }
  206.                         break;
  207.                     case 0b110: //ori
  208.                         reg[rd] = reg[rs1] | i_imm;
  209.                         break;
  210.                     case 0b111: // andi
  211.                         reg[rd] = reg[rs1] & i_imm;
  212.                         break;
  213.                     default:
  214.                         printf("\n ERROR, I-type (2) func3 can't be %d \n", func3);
  215.                         break;
  216.                 }
  217.                 break;
  218.  
  219.            
  220.             case 0b0110111: // U type, lui
  221.                 reg[rd] = (u_imm << 12);
  222.                 break;
  223.  
  224.  
  225.             case 0x73:
  226.                 printf("ecall \n");
  227.                 break;
  228.             default:
  229.                 printf("\n ERROR, opcode can't be %d \n", opcode);
  230.                 break;
  231.         }
  232.  
  233.         PC++; // We count in 4 byte words
  234.  
  235.         for (int i = 0; i < 32; ++i) {
  236.             if(i==8 || i==16 || i==24) printf("\n");
  237.             printf("x%2d = %8x | ", i, reg[i]);
  238.         }
  239.         printf("\n");
  240.     }
  241.     printf("\nProgram exit \n\n");
  242.     return 0;
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement