////////////////////////////////////////////////////////////////////////////// //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 . // ////////////////////////////////////////////////////////////////////////////// /**************************************************************************/ /* */ /* 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 /***************************######******************************************** * 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