Added bin2mif utility
git-svn-id: http://www.cdkersey.com/harp/harptool@124 0246edb2-e076-4747-b392-db732a341fa2
This commit is contained in:
101
ISET
101
ISET
@@ -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. */
|
|
||||||
4
util/Makefile
Normal file
4
util/Makefile
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
bin2mif : bin2mif.cpp
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f bin2mif
|
||||||
63
util/bin2mif.cpp
Normal file
63
util/bin2mif.cpp
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// bin2mif -- Convert binary file to Memory Initialization File used by some
|
||||||
|
// FPGA toolchains.
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
if (argc != 5) {
|
||||||
|
cerr << "Usage:\n " << argv[0] << ' ' << "<word size(bytes)>"
|
||||||
|
<< " <mem size(bytes)> <in file> <out file>\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<unsigned char> 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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user