diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2012-07-31 15:16:04 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2012-07-31 15:16:04 +0000 |
| commit | 83b321d862472f31c0c9f7feca8360ad5bfe8a75 (patch) | |
| tree | 0f0ef20ad78e25b320013c7bb160211a8612d4e9 /src/runtime/c/teyjus/simulator/siminit.c | |
| parent | 314662dd09d5d1480007faa79258b0e93cc2aa59 (diff) | |
An initial import of the teyjus source code in the C runtime for GF. The two runtime are still not connected but the source code compiles.
Diffstat (limited to 'src/runtime/c/teyjus/simulator/siminit.c')
| -rw-r--r-- | src/runtime/c/teyjus/simulator/siminit.c | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/src/runtime/c/teyjus/simulator/siminit.c b/src/runtime/c/teyjus/simulator/siminit.c new file mode 100644 index 000000000..b6de2acea --- /dev/null +++ b/src/runtime/c/teyjus/simulator/siminit.c @@ -0,0 +1,275 @@ +////////////////////////////////////////////////////////////////////////////// +//Copyright 2008 +// Andrew Gacek, Steven Holte, Gopalan Nadathur, Xiaochu Qi, Zach Snow +////////////////////////////////////////////////////////////////////////////// +// This file is part of Teyjus. // +// // +// Teyjus is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// (at your option) any later version. // +// // +// Teyjus is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with Teyjus. If not, see <http://www.gnu.org/licenses/>. // +////////////////////////////////////////////////////////////////////////////// +/**************************************************************************/ +/* */ +/* File siminit.c. */ +/**************************************************************************/ +#ifndef SIMINIT_C +#define SIMINIT_C + +#include "siminit.h" +#include "abstmachine.h" +#include "dataformats.h" +#include "io-datastructures.h" +#include "builtins/builtins.h" +#include "../tables/instructions.h" +#include "../system/error.h" +#include "../system/message.h" + +#include <stdio.h> +/***************************######******************************************** + * ERROR INFORMATION + *********************************######**************************************/ +static MSG_Msg SIM_errorMessages[SIM_NUM_ERROR_MESSAGES] = +{ + { SIM_ERROR, + 0, + "Simulator: ", + 0, 0, 0 }, + { SIM_ERROR_TOO_MANY_ABSTRACTIONS, + SIM_ERROR, + "Abstraction embedding depth has exceeded maximum of %d.", + EM_NEWLINE, EM_TOP_LEVEL, 4 }, + { SIM_ERROR_TOO_MANY_ARGUMENTS, + SIM_ERROR, + "Application arguments has exceeded maximum of %d.", + EM_NEWLINE, EM_TOP_LEVEL, 4 }, + { SIM_ERROR_TOO_MANY_UNIV_QUANTS, + SIM_ERROR, + "Too many universal quantifiers.", + EM_NEWLINE, EM_TOP_LEVEL, 3 }, + { SIM_ERROR_HEAP_TOO_BIG, + SIM_ERROR, + "Specified heap size (%uK) is larger than maximum of 256Gb.", + EM_NEWLINE, EM_ABORT, 1 }, + { SIM_ERROR_HEAP_TOO_SMALL, + SIM_ERROR, + "Specified heap size (%uK) is smaller than minimum of 10K.", + EM_NEWLINE, EM_ABORT, 1 }, + { SIM_ERROR_CANNOT_ALLOCATE_HEAP, + SIM_ERROR_CANNOT_ALLOCATE_HEAP_MESSAGE, + "", + SIM_ERROR_CANNOT_ALLOCATE_HEAP_SUGGESTION, EM_ABORT, 1 }, + { SIM_ERROR_CANNOT_ALLOCATE_HEAP_MESSAGE, + SIM_ERROR, + "Could not allocate heap of size %uK at 0x%08x using %s.", + EM_NEWLINE, EM_NO_EXN, 1 }, + { SIM_ERROR_CANNOT_ALLOCATE_HEAP_SUGGESTION, + SIM_ERROR, + "Try modifying the configuration and recompiling.", + EM_NEWLINE, EM_NO_EXN, 1 }, + { SIM_ERROR_TRAIL_OVERFL, + SIM_ERROR, + "Trail overflow.", + EM_NEWLINE, EM_TOP_LEVEL, 1 }, + { SIM_ERROR_HEAP_OVERFL, + SIM_ERROR, + "Heap overflow.", + EM_NEWLINE, EM_TOP_LEVEL, 1 }, + { SIM_ERROR_STACK_OVERFL, + SIM_ERROR, + "Stack overflow.", + EM_NEWLINE, EM_TOP_LEVEL, 1 }, + { SIM_ERROR_PDL_OVERFL, + SIM_ERROR, + "PDL overflow.", + EM_NEWLINE, EM_TOP_LEVEL, 1 } +}; + + +/*************************************************************************/ +/* SETTING UP SPECIAL CODE SEGMENTS */ +/*************************************************************************/ +static const int SINIT_initSize = 31; + +static void SINIT_initCode() +{ + MemPtr nhreg = AM_hreg + SINIT_initSize; + CSpacePtr myhreg = (CSpacePtr)AM_hreg; + + AM_heapError(nhreg); + + //builtinCode + AM_builtinCode = myhreg; + *((INSTR_OpCode*)myhreg) = builtin; //builtin ... + myhreg += INSTR_I1X_LEN; + + //eqCode + AM_eqCode = myhreg; + *((INSTR_OpCode*)myhreg) = pattern_unify_t; //pattern_unify A1, A2 + *((INSTR_RegInd*)(myhreg + INSTR_RRX_R1)) = 1; + *((INSTR_RegInd*)(myhreg + INSTR_RRX_R2)) = 2; + myhreg += INSTR_RRX_LEN; + *((INSTR_OpCode*)myhreg) = finish_unify; //finish_unify + myhreg += INSTR_X_LEN; + *((INSTR_OpCode*)myhreg) = proceed; //proceed + myhreg += INSTR_X_LEN; + + //failCode + AM_failCode = myhreg; + *((INSTR_OpCode*)myhreg) = fail; //fail + myhreg += INSTR_X_LEN; + + //andCode + *((INSTR_OneByteInt*)(myhreg + INSTR_I1LX_I1)) = 2;//"call" 2 L + myhreg += INSTR_I1LX_LEN; + AM_andCode = myhreg; + *((INSTR_OpCode*)myhreg) = put_value_p; //put_value Y1, A1 + *((INSTR_EnvInd*)(myhreg + INSTR_ERX_E)) = 1; + *((INSTR_RegInd*)(myhreg + INSTR_ERX_R)) = 1; + myhreg += INSTR_ERX_LEN; + *((INSTR_OpCode*)myhreg) = put_level; //put_level Y2 + *((INSTR_EnvInd*)(myhreg + INSTR_EX_E)) = 2; + myhreg += INSTR_EX_LEN; + *((INSTR_OpCode*)myhreg) = deallocate; //deallocate + myhreg += INSTR_X_LEN; + + //solveCode + AM_solveCode = myhreg; + *((INSTR_OpCode*)myhreg) = builtin; //builtin BI_SOLVE + *((INSTR_OneByteInt*)(myhreg + INSTR_I1X_I1)) = BI_SOLVE; + myhreg += INSTR_I1X_LEN; + + //proceed + AM_proceedCode = myhreg; //proceed + *((INSTR_OpCode*)myhreg) = proceed; + myhreg += INSTR_X_LEN; + + //orCode + AM_orCode = myhreg; + *((INSTR_OpCode*)myhreg) = trust_me; //trust_me 1 + *((INSTR_OneByteInt*)(myhreg + INSTR_I1WPX_I1)) = 1; + myhreg += INSTR_I1WPX_LEN; + *((INSTR_OpCode*)myhreg) = builtin; //builtin BI_SOLVE + *((INSTR_OneByteInt*)(myhreg + INSTR_I1X_I1)) = BI_SOLVE; + myhreg += INSTR_I1X_LEN; + + //allcode + *((INSTR_OneByteInt*)(myhreg + INSTR_I1LX_I1)) = 0; //"call" 0 L + myhreg += INSTR_I1LX_LEN; + AM_allCode = myhreg; + *((INSTR_OpCode*)myhreg) = decr_universe; //decr_universe + myhreg += INSTR_X_LEN; + *((INSTR_OpCode*)myhreg) = deallocate; //deallocate + myhreg += INSTR_X_LEN; + *((INSTR_OpCode*)myhreg) = proceed; //proceed + myhreg += INSTR_X_LEN; + + //stopCode + AM_stopCode = myhreg; + *((INSTR_OpCode*)myhreg) = stop; //stop + myhreg += INSTR_X_LEN; + + //notCode2 + AM_notCode2 = myhreg; + *((INSTR_OpCode*)myhreg) = trust_me; //trust_me 0 + *((INSTR_OneByteInt*)(myhreg + INSTR_I1WPX_I1)) = 0; + myhreg += INSTR_I1WPX_LEN; + *((INSTR_OpCode*)myhreg) = proceed; //proceed + myhreg += INSTR_X_LEN; + + //notCode1 + AM_notCode1 = myhreg; + *((INSTR_OpCode*)myhreg) = allocate; //allocate 2 + *((INSTR_OneByteInt*)(myhreg + INSTR_I1X_I1)) = 2; + myhreg += INSTR_I1X_LEN; + *((INSTR_OpCode*)myhreg) = get_level; //get_level Y1 + *((INSTR_EnvInd*)(myhreg + INSTR_EX_E)) = 1; + myhreg += INSTR_EX_LEN; + *((INSTR_OpCode*)myhreg) = call_builtin; //call_builtin 1 BI_SOLVE + *((INSTR_OneByteInt*)(myhreg + INSTR_I1I1WPX_I11)) = 1; + *((INSTR_OneByteInt*)(myhreg + INSTR_I1I1WPX_I12)) = BI_SOLVE; + myhreg += INSTR_I1I1WPX_LEN; + *((INSTR_OpCode*)myhreg) = cut; //cut 1 + *((INSTR_EnvInd*)(myhreg + INSTR_EX_E)) = 1; + myhreg += INSTR_EX_LEN; + *((INSTR_OpCode*)myhreg) = fail; //fail + myhreg += INSTR_X_LEN; + + //haltCode + AM_haltCode = myhreg; + *((INSTR_OpCode*)myhreg) = halt; //halt + myhreg += INSTR_X_LEN; + + AM_hreg = nhreg; +} + +/***************************************************************************** + * THE PUBLIC ROUTINES * + *****************************************************************************/ +void SINIT_preInit() +{ + /* errors get initialized before ANYTHING */ + MSG_addMessages(SIM_NUM_ERROR_MESSAGES, SIM_errorMessages); +} + +void SINIT_simInit() +{ + AM_hreg = AM_heapBeg; //heap + AM_hbreg = AM_heapBeg; + AM_ereg = AM_stackBeg; //stack + AM_ireg = AM_stackBeg; + AM_cireg = AM_stackBeg; + AM_initPDL(); //pdl + AM_trreg = AM_trailBeg; //trail + AM_llreg = DF_EMPTY_DIS_SET; //live list + AM_bndFlag = OFF; //bind flag + AM_ucreg = 0; //uc reg + + //make a dummy first mod point at the beginning of the stack + AM_mkDummyImptRec(AM_ireg); + + /* perform initialization for the term io system */ + IO_initIO(); + + /* and set up some built-in code */ + SINIT_initCode(); + + /* set up the base branch register to put the heap back to this point */ + AM_breg = AM_stackBeg + AM_DUMMY_IMPT_REC_SIZE; + *AM_breg = (Mem)AM_hreg; + + AM_fstCP = AM_b0reg = AM_breg; + AM_tosreg = AM_breg + 1; +} + +void SINIT_reInitSimState(Boolean inDoInitializeImports) +{ + AM_initPDL(); //pdl + AM_ereg = AM_stackBeg; //stack + AM_trreg = AM_trailBeg; //trail + AM_llreg = DF_EMPTY_DIS_SET; //live list + AM_ucreg = 0; //uc reg + AM_bndFlag = OFF; //bind flag + AM_breg = AM_fstCP; + AM_hreg = AM_cpH(); + AM_hreg = *((MemPtr *)AM_breg); + + /* initialize ireg if necessary */ + if (inDoInitializeImports) { + AM_ireg = AM_stackBeg; + AM_tosreg = AM_breg + 1; + } + + IO_initIO(); +} + + +#endif //SIMINIT_H |
