From d6e8108f24715f32c7988940001212b8a8fb2512 Mon Sep 17 00:00:00 2001 From: chad Date: Wed, 30 Jan 2013 19:16:17 +0000 Subject: [PATCH] Added bin2mif utility git-svn-id: http://www.cdkersey.com/harp/harptool@124 0246edb2-e076-4747-b392-db732a341fa2 --- ISET | 101 ----------------------------------------------- util/Makefile | 4 ++ util/bin2mif.cpp | 63 +++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 101 deletions(-) delete mode 100644 ISET create mode 100644 util/Makefile create mode 100644 util/bin2mif.cpp diff --git a/ISET b/ISET deleted file mode 100644 index d32d7a65..00000000 --- a/ISET +++ /dev/null @@ -1,101 +0,0 @@ -Instruction Set Reference -========================= - - NOP /* No operation */ - -Privileged Instructions ------------------------ - - EI /* Enable interrupts (privileged) */ - DI /* Disable interrupts (privileged) */ - SKEP %reg /* Set kernel entry point. */ - TLBADD %virt, %phys, %flags /* Add entry to TLB */ - TLBRM %virt /* Remove entry corresponding to a given virtual address. */ - TLBFLUSH /* Flush all TLB entries */ - JMPRU %reg /* Jump to location in a register and switch to user mode. */ - RETI /* Return from interrupt (Restore shadow regs/PC, threads) */ - HALT /* Stop CPU until next interrupt. */ - -Memory Loads/Stores -------------------- - - ST %reg, %reg, #imm /* Store reg to reg+imm */ - LD %reg, %reg, #imm /* Load reg from reg+imm */ - -Predicate Manipulation ----------------------- - - ANDP @preg, @preg, @preg - ORP @preg, @preg, @preg - XORP @preg, @preg, @preg - NOTP @preg, @preg - -Value Tests ------------ - - RTOP @preg, %reg /* Register to predicate. Same as ISZERO => NOTP */ - ISNEG @preg, %reg - ISZERO @preg, %reg - -Immediate Integer Arithmetic/Logic ----------------------------------- - - LDI %reg, #IMM /* Load immediate. */ - ADDI %reg, %reg, #IMM /* Add immediate */ - SUBI %reg, %reg, #IMM /* Subtract immediate */ - MULI %reg, %reg, #IMM /* Multiply immediate */ - DIVI %reg, %reg, #IMM /* Divide immediate */ - MODI %reg, %reg, #IMM /* Modulus immediate */ - SHLI %reg, %reg, #IMM /* Shift left immediate */ - SHRI %reg, %reg, #IMM /* Shift right immediate */ - ANDI %reg, %reg, #IMM /* And immediate */ - ORI %reg, %reg, #IMM /* Or immediate */ - XORI %reg, %reg, #IMM /* Xor immediate */ - -Register Integer Arithmetic/Logic ---------------------------------- - - ADD %reg, %reg, %reg /* Add */ - SUB %reg, %reg, %reg /* Subtract */ - MUL %reg, %reg, %reg /* Multiply */ - DIV %reg, %reg, %reg /* Divide */ - MOD %reg, %reg, %reg /* Modulus */ - SHL %reg, %reg, %reg /* Shift left */ - SHR %reg, %reg, %reg /* Shift right */ - AND %reg, %reg, %reg /* Bitwise and */ - OR %reg, %reg, %reg /* Bitwise or */ - XOR %reg, %reg, %reg /* Bitwise xor */ - NEG %reg, %reg /* Negate */ - NOT %reg, %reg /* Bitwise invert */ - -Floating Point Arithmetic -------------------------- - - ITOF %reg, %reg /* Integer to floating point. */ - FTOI %reg, %reg /* Floating point to integer, truncate. */ - FNEG %reg, %reg /* Negate floating point number. */ - FADD %reg, %reg, %reg /* Add, full precision. */ - FSUB %reg, %reg, %reg /* Subtract, full precision. */ - FMUL %reg, %reg, %reg /* Multiply, full precision. */ - FDIV %reg, %reg, %reg /* Divide, full precision. */ - -Control Flow ------------- - - JMPI #IMM /* Jump to immediate */ - JMPR %reg /* Jump indirect (to register) */ - JALI %reg, #IMM /* Jump and link immediate */ - JALR %reg, %reg /* Jump and link indirect */ - -SIMD Control ------------- - - CLONE %reg /* Clone register state in to thread %reg */ - JALIS %reg, %rN, #IMM /* Jump and link immediate, spawning cloned threads. */ - JALRS %rL, %rL, %rN /* Jump and link indirect, spawning clowned threads. */ - JMPRT %reg /* Jump to register, terminating cloned threads. */ - -Other ------ - - TRAP /* Program-generated interrupt. */ diff --git a/util/Makefile b/util/Makefile new file mode 100644 index 00000000..dda0940b --- /dev/null +++ b/util/Makefile @@ -0,0 +1,4 @@ +bin2mif : bin2mif.cpp + +clean : + rm -f bin2mif diff --git a/util/bin2mif.cpp b/util/bin2mif.cpp new file mode 100644 index 00000000..56c209d6 --- /dev/null +++ b/util/bin2mif.cpp @@ -0,0 +1,63 @@ +// bin2mif -- Convert binary file to Memory Initialization File used by some +// FPGA toolchains. + +#include +#include +#include +#include +#include + +int main(int argc, char** argv) { + using namespace std; + + if (argc != 5) { + cerr << "Usage:\n " << argv[0] << ' ' << "" + << " \n";; + return 1; + } + + ifstream in(argv[3]); + ofstream out(argv[4]); + + if (!in) { + cerr << "Failed to open input file \"" << argv[3] << "\"\n"; + return 1; + } + + if (!out) { + cerr << "Failed to open output file \"" << argv[4] << "\"\n"; + return 1; + } + + unsigned word(atol(argv[1])), mem_sz(atol(argv[2])/word); + + out << "DEPTH = " << mem_sz << ";\n" + << "WIDTH = " << word*8 << ";\n" + << "ADDRESS_RADIX = HEX;\n" + << "DATA_RADIX = HEX;\n" + << "CONTENT\n" + << "BEGIN\n"; + + // HARP is little endian, so no matter what the endianness of the machine on + // which this utility runs, this swapping of the byte order when constructing + // hex values is necessary. + for (unsigned j = 0; j < mem_sz; ++j) { + stack bytes; + + out << setw(4) << setfill('0') << hex << j << " : "; + for (unsigned i = 0; i < word; ++i) { + if (!in.eof()) bytes.push(in.get()); + else bytes.push(0); + } + for (unsigned i = 0; i < word; ++i) { + out << hex << setw(2) << setfill('0') << unsigned(bytes.top()); + bytes.pop(); + } + out << ";\n"; + if (in.eof()) break; + } + + out << "END;"; + + return 0; +}