diff --git a/Makefile b/Makefile index fca8a95..e7ba771 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ comp: lex compiler/lex.l yacc -d compiler/grammar.y - gcc -o bin/main y.tab.c lex.yy.c compiler/create.c compiler/compiler.c compiler/codegen.c main/main.c + gcc -o bin/main y.tab.c lex.yy.c compiler/create.c compiler/compiler.c compiler/codegen.c compiler/opcode.c main/main.c diff --git a/compiler/opcode.c b/compiler/opcode.c new file mode 100644 index 0000000..f32fcce --- /dev/null +++ b/compiler/opcode.c @@ -0,0 +1,88 @@ +#include "../include/SVM_code.h" + +OpcodeInfo dvm_opcode_info[] = { + {"FALSE", "", -1}, + {"PUSHDATA1", "b", 1}, + {"PUSHDATA2", "s", 1}, + {"PUSHDATA4", "l", 1}, + {"NEGATE", "", 0}, + {"NOP", "", 1}, + {"JUMP", "", -1}, + {"JUMPIF", "", -1}, + {"VERIFY", "", -1}, + {"FAIL", "", -1}, + {"TOALTSTACK", "", 1}, + {"FROMALTSTACK", "", 1}, + {"DROP2", "", -1}, + {"DUP2", "", 1}, + {"DUP3", "", 1}, + {"OVER2", "", 1}, + {"ROT2", "", 1}, + {"SWAP2", "", 1}, + {"IFDUP", "", 1}, + {"DEPTH", "", 1}, + {"DROP", "", -1}, + {"DUP", "", 1}, + {"NIP", "", 1}, + {"OVER", "", 1}, + {"PICK", "", 1}, + {"ROLL", "", 1}, + {"ROT", "", 1}, + {"SWAP", "", 1}, + {"TUCK", "", 1}, + {"CAT", "", 1}, + {"SUBSTR", "", 1}, + {"LEFT", "", 1}, + {"RIGHT", "", 1}, + {"SIZE", "", 1}, + {"CATPUSHDATA", "", 1}, + {"INVERT", "", 1}, + {"AND", "", -1}, + {"OR", "", -1}, + {"XOR", "", -1}, + {"EQUAL", "", -1}, + {"EQUALVERIFY", "", -1}, + {"ADD1", "", -1}, + {"SUB1", "", -1}, + {"MUL2", "", -1}, + {"DIV2", "", -1}, + {"NEGATE", "", -1}, + {"ABS", "", 0}, + {"NOT", "", 0}, + {"NOTEQUAL0", "", 0}, + {"ADD", "", -1}, + {"SUB", "", -1}, + {"MUL", "", -1}, + {"DIV", "", -1}, + {"MOD", "", -1}, + {"LSHIFT", "", -1}, + {"RSHIFT", "", -1}, + {"BOOLAND", "", -1}, + {"BOOLOR", "", -1}, + {"NUMEQUAL", "", -1}, + {"NUMEQUALVERIFY", "", -1}, + {"NUMNOTEQUAL", "", -1}, + {"LESSTHAN", "", -1}, + {"GREATERTHAN", "", -1}, + {"LESSTHANOREQUAL", "", -1}, + {"GREATERTHANOREQUAL", "", -1}, + {"MIN", "", -1}, + {"MAX", "", -1}, + {"WITHIN", "", -1}, + /**********/ + {"SHA256", "", 0}, + {"SHA3", "", 0}, + {"HASH160", "", 0}, + {"CHECKSIG", "", -1}, + {"CHECKMULTISIG", "", -1}, + {"TXSIGHASH", "", 0}, + /**********/ + {"CHECKOUTPUT", "", -1}, + {"ASSET", "", -1}, + {"AMOUNT", "", -1}, + {"PROGRAM", "", -1}, + {"INDEX", "", -1}, + {"ENTRYID", "", -1}, + {"OUTPUTID", "", -1}, + {"BLOCKHEIGHT", "", -1}, +}; \ No newline at end of file diff --git a/include/SVM_code.h b/include/SVM_code.h new file mode 100644 index 0000000..0f6a887 --- /dev/null +++ b/include/SVM_code.h @@ -0,0 +1,97 @@ +#ifndef _SVMCODE_H_ +#define _SVMCODE_H_ + +typedef enum { + FALSE = 1, + PUSHDATA1, + PUSHDATA2, + PUSHDATA4, + NEGATE1, + NOP, + JUMP, + JUMPIF, + VERIFY, + FAIL, + TOALTSTACK, + FROMALTSTACK, + DROP2, + DUP2, + DUP3, + OVER2, + ROT2, + SWAP2, + IFDUP, + DEPTH, + DROP, + DUP, + NIP, + OVER, + PICK, + ROLL, + ROT, + SWAP, + TUCK, + CAT, + SUBSTR, + LEFT, + RIGHT, + SIZE, + CATPUSHDATA, + INVERT, + AND, + OR, + XOR, + EQUAL, + EQUALVERIFY, + ADD1, + SUB1, + MUL2, + DIV2, + NEGATE, + ABS, + NOT, + NOTEQUAL0, + ADD, + SUB, + MUL, + DIV, + MOD, + LSHIFT, + RSHIFT, + BOOLAND, + BOOLOR, + NUMEQUAL, + NUMEQUALVERIFY, + NUMNOTEQUAL, + LESSTHAN, + GREATERTHAN, + LESSTHANOREQUAL, + GREATERTHANOREQUAL, + MIN, + MAX, + WITHIN, + /**********/ + SHA256, + SHA3, + HASH160, + CHECKSIG, + CHECKMULTISIG, + TXSIGHASH, + /**********/ + CHECKOUTPUT, + ASSET, + AMOUNT, + PROGRAM, + INDEX, + ENTRYID, + OUTPUTID, + BLOCKHEIGHT +}SVM_Opcode; + +typedef struct { + char *mnemonic; + char *parameter; + int stack_increment; +} OpcodeInfo; + +#endif \ No newline at end of file