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/abstmachine.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/abstmachine.c')
| -rw-r--r-- | src/runtime/c/teyjus/simulator/abstmachine.c | 617 |
1 files changed, 617 insertions, 0 deletions
diff --git a/src/runtime/c/teyjus/simulator/abstmachine.c b/src/runtime/c/teyjus/simulator/abstmachine.c new file mode 100644 index 000000000..a1b4da273 --- /dev/null +++ b/src/runtime/c/teyjus/simulator/abstmachine.c @@ -0,0 +1,617 @@ +////////////////////////////////////////////////////////////////////////////// +//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 abstmachine.c. This file defines the various registers, */ +/* data areas and record types and their operations relevant to the */ +/* abstract machine. */ +/* */ +/****************************************************************************/ +#ifndef ABSTMACHINE_C +#define ABSTMACHINE_C + +#include "mctypes.h" +#include "mcstring.h" +#include "dataformats.h" +#include "abstmachine.h" +#include "instraccess.h" +#include "../system/error.h" +#include "../system/memory.h" + +/****************************************************************************/ +/* ABSTRACT MACHINE REGISTERS (AND FLAGS) */ +/****************************************************************************/ +AM_DataType AM_regs[AM_NUM_OF_REG];//argument regs/temp variable +//data register access: return the address of the ith register +AM_DataTypePtr AM_reg(int i) { return (AM_regs + i); } + +MemPtr AM_hreg; //heap top +MemPtr AM_hbreg; //heap backtrack point +MemPtr AM_ereg; //current environment +MemPtr AM_breg; //last choice point +MemPtr AM_b0reg; //cut point +MemPtr AM_ireg; //impl pt reg, defining prog context +MemPtr AM_cireg; //impl pt for current clause +MemPtr AM_cereg; //closure environment +MemPtr AM_tosreg; //top of stack impl or choice pt. +MemPtr AM_trreg; //trail top +MemPtr AM_pdlTop; //top of pdl +MemPtr AM_pdlBot; //(moving) bottom of pdl +MemPtr AM_typespdlBot; //(moving) bottom of types pdl + +DF_TermPtr AM_sreg; //"structure" pointer +DF_TypePtr AM_tysreg; //type structure pointer + +CSpacePtr AM_preg; //program pointer +CSpacePtr AM_cpreg; //continuation pointer + +Flag AM_bndFlag; //does binding of free var (term) occur? +Flag AM_writeFlag; //in write mode? +Flag AM_tyWriteFlag; //in ty write mode? +Flag AM_ocFlag; //occurs check? + +Flag AM_consFlag; //cons? +Flag AM_rigFlag; //rigid? + +//The size of AM_numAbs is decided by that of relevant fields in term +//representations which can be found in dataformats.c +TwoBytes AM_numAbs; //number of abstractions in hnf +//The size of AM_numArgs is decided by that of relevant fields in term +//representations which can be found in dataformats.c +TwoBytes AM_numArgs; //number of arguments in hnf + +DF_TermPtr AM_head; //head of a hnf +DF_TermPtr AM_argVec; //argument vector of a hnf + +DF_TermPtr AM_vbbreg; //variable being bound for occ +DF_TypePtr AM_tyvbbreg; //type var being bound for occ + +//The size of AM_adjreg is decided by that of relevant fields in term +//representations which can be found in dataformats.c +TwoBytes AM_adjreg; //univ count of variable being bound +TwoBytes AM_ucreg; //universe count register + +DF_DisPairPtr AM_llreg; //ptr to the live list + +/****************************************************************************/ +/* STACK, HEAP, TRAIL AND PDL RELATED STUFF */ +/****************************************************************************/ + +MemPtr AM_heapBeg, //beginning of the heap + AM_heapEnd, //end of the heap + AM_stackBeg, //beginning of the trail + AM_stackEnd, //end of the trail + AM_trailBeg, //beginning of the trail + AM_trailEnd, //end of the trail + AM_pdlBeg, //beginning of pdl + AM_pdlEnd, //end of pdl + AM_fstCP; //the first choice point + +/****************************************************************************/ +/* CODE PLACED IN THE HEAP BY THE SYSTEM */ +/****************************************************************************/ +CSpacePtr AM_failCode; +CSpacePtr AM_andCode; +CSpacePtr AM_orCode; +CSpacePtr AM_allCode; +CSpacePtr AM_solveCode; +CSpacePtr AM_builtinCode; +CSpacePtr AM_eqCode; +CSpacePtr AM_stopCode; +CSpacePtr AM_haltCode; +CSpacePtr AM_notCode1; +CSpacePtr AM_notCode2; +CSpacePtr AM_proceedCode; + + +Boolean AM_isFailInstr(CSpacePtr cptr) { return (cptr == AM_failCode); } +/****************************************************************************/ +/* VITUAL MACHINE MEMORY OPERATIONS */ +/****************************************************************************/ +//is the given addr referring to a register? +Boolean AM_regAddr(MemPtr p) +{ + //TODO: + // AM_reg lacked conversion to MemPtr; why is a function getting + // converted in this way? + return ((((MemPtr)AM_reg) <= p) && (p < (MemPtr)((MemPtr)AM_reg + AM_NUM_OF_REG))); +} +//is the given addr on stack? +Boolean AM_stackAddr(MemPtr p) { return (p > AM_hreg); } +//is the given addr not on heap? +Boolean AM_nHeapAddr(MemPtr p) { return ((p > AM_hreg) || (AM_heapBeg > p));} + + //is the "first" impl/impt record? +Boolean AM_botIP(MemPtr p) { return (p == AM_stackBeg); } +//is the "first" choice point"? +Boolean AM_botCP() { return (AM_breg == AM_fstCP); } +//no env record left on the stack? +Boolean AM_noEnv() { return (AM_ereg == AM_stackBeg); } + + +MemPtr AM_findtos(int i) +{ + return ((AM_tosreg > AM_ereg) ? AM_tosreg : + (MemPtr)(((AM_DataTypePtr)(AM_ereg + 2)) + i)); +} +MemPtr AM_findtosEnv() +{ + return ((AM_tosreg > AM_ereg) ? AM_tosreg : + (MemPtr)(((AM_DataTypePtr)(AM_ereg + 2))+INSACC_CALL_I1(AM_cpreg))); + +} +//set AM_tosreg to the top imp or choice pt +void AM_settosreg() +{ + if (AM_ireg > AM_breg) AM_tosreg = AM_ireg + AM_IMP_FIX_SIZE; + else AM_tosreg = AM_breg + 1; +} + + +/***************************************************************************/ +/* ENVIRONMENT RECORD OPERATIONS */ +/***************************************************************************/ +//environment record creation function +MemPtr AM_mkEnv(MemPtr ep) //create the fixed part of env rec +{ + *((MemPtr *)(ep - 3)) = AM_cireg; //CI field + *((MemPtr *)(ep - 2)) = AM_ereg; //CE field + *((int *)(ep - 1)) = AM_ucreg; //UC field + *((CSpacePtr *)ep) = AM_cpreg; //CP field + return (ep - 1); +} +MemPtr AM_mkEnvWOUC(MemPtr ep) //ct fixed part of env without uc +{ + *((MemPtr *)(ep - 3)) = AM_cireg; //CI field + *((MemPtr *)(ep - 2)) = AM_ereg; //CE field + *((CSpacePtr *)ep) = AM_cpreg; //CP field + return (ep - 1); +} + +//environment record access functions (current top-level env record) +//the env continuation point +CSpacePtr AM_envCP() { return *((CSpacePtr *)(AM_ereg + 1));} +//the uc value +int AM_envUC() { return *((int *)AM_ereg); } +//continuation point +MemPtr AM_envCE() { return *((MemPtr *)(AM_ereg - 1)); } +//impl point +MemPtr AM_envCI(MemPtr ep) { return *((MemPtr *)(AM_ereg - 2)); } +//the nth var fd +AM_DataTypePtr AM_envVar(int n) +{ + return (AM_DataTypePtr)(((AM_DataTypePtr)AM_ereg) + n); +} +//is p an address in the current env? +Boolean AM_inCurEnv(MemPtr p) { return (p > AM_ereg); } + +//access functions for clause environment +AM_DataTypePtr AM_cenvVar(int n) //the nth var fd in clause env +{ + return (AM_DataTypePtr)(((AM_DataTypePtr)AM_cereg) + n); +} + +/****************************************************************************/ +/* CHOICE POINT OPERATIONS */ +/****************************************************************************/ +//choice point creation functions +void AM_mkCP(MemPtr cp, CSpacePtr label, int n) //create a choice pt +{ + *((MemPtr *)cp) = AM_hreg; //heap point + *((CSpacePtr *)(cp - 1)) = label; //next clause ptr + *((MemPtr *)(cp - 2)) = AM_trreg; //trail point + *((DF_DisPairPtr *)(cp - 3)) = AM_llreg; //live list + *((MemPtr *)(cp - 4)) = AM_b0reg; //cut point + *((MemPtr *)(cp - 5)) = AM_breg; //previous choice pt + *((MemPtr *)(cp - 6)) = AM_cireg; //clause context + *((MemPtr *)(cp - 7)) = AM_ireg; //program context + *((CSpacePtr *)(cp - 8)) = AM_cpreg; //cont. code ptr + *((MemPtr *)(cp - 9)) = AM_ereg; //cont. env ptr + *((TwoBytes *)(cp - 10)) = AM_ucreg; //universe count + + for (; n > 0; n--) //save reg(1) to reg(n) + *(((AM_DataTypePtr)(cp - 10)) - n) = *AM_reg(n); +} +void AM_saveStateCP(MemPtr cp, CSpacePtr label) +{ + *((MemPtr *)cp) = AM_hreg; //heap point + *((CSpacePtr *)(cp - 1)) = label; //next clause ptr + *((MemPtr *)(cp - 2)) = AM_trreg; //trail point + *((DF_DisPairPtr *)(cp - 3)) = AM_llreg; //live list + *((MemPtr *)(cp - 4)) = AM_b0reg; //cut point + *((MemPtr *)(cp - 5)) = AM_breg; //previous choice pt + *((MemPtr *)(cp - 6)) = AM_cireg; //clause context + *((MemPtr *)(cp - 7)) = AM_ireg; //program context + *((CSpacePtr *)(cp - 8)) = AM_cpreg; //cont. code ptr + *((MemPtr *)(cp - 9)) = AM_ereg; //cont. env ptr + *((TwoBytes *)(cp - 10)) = AM_ucreg; //universe count +} +//set the next clause field in the current top choice point +void AM_setNClCP(CSpacePtr ncl) +{ + *((CSpacePtr *)(AM_breg - 1)) = ncl; +} + + +//restore function +//restore all components of a choice point except the trail top and the +//backtrack point registers +void AM_restoreRegs(int n) +{ + for (; n > 0; n--) + AM_regs[n] = *(((AM_DataTypePtr)(AM_breg - 10)) - n); + + AM_hreg = *((MemPtr *)AM_breg); + AM_llreg = *((DF_DisPairPtr *)(AM_breg - 3)); + AM_b0reg = *((MemPtr *)(AM_breg - 4)); + AM_cireg = *((MemPtr *)(AM_breg - 6)); + AM_ireg = *((MemPtr *)(AM_breg - 7)); + AM_cpreg = *((CSpacePtr *)(AM_breg - 8)); + AM_ereg = *((MemPtr *)(AM_breg - 9)); + AM_ucreg = *((TwoBytes *)(AM_breg - 10)); +} +//restore all components of a choice point except the trail top, the backtrack +//point and the clause context registers +void AM_restoreRegsWoCI(int n) +{ + for (; n > 0; n--) + AM_regs[n] = *(((AM_DataTypePtr)(AM_breg - 10)) - n); + + AM_hreg = *((MemPtr *)AM_breg); + AM_llreg = *((DF_DisPairPtr *)(AM_breg - 3)); + AM_b0reg = *((MemPtr *)(AM_breg - 4)); + AM_ireg = *((MemPtr *)(AM_breg - 7)); + AM_cpreg = *((CSpacePtr *)(AM_breg - 8)); + AM_ereg = *((MemPtr *)(AM_breg - 9)); + AM_ucreg = *((TwoBytes *)(AM_breg - 10)); +} + +//access functions +MemPtr AM_cpH() { return *((MemPtr *)(AM_breg)); } +CSpacePtr AM_cpNCL() { return *((CSpacePtr *)(AM_breg - 1)); } +MemPtr AM_cpTR() { return *((MemPtr *)(AM_breg - 2)); } +MemPtr AM_cpB() { return *((MemPtr *)(AM_breg - 5)); } +MemPtr AM_cpCI() { return *((MemPtr *)(AM_breg - 6)); } + +AM_DataTypePtr AM_cpArg(MemPtr cp, int n) //addr of nth arg in a given cp +{ + return ((AM_DataTypePtr)(cp - 10)) - n; +} + +/***************************************************************************/ +/* IMPLICATION/IMPORT RECORD OPERATIONS */ +/***************************************************************************/ +/* The tags for distinguishing implication and import records */ +typedef enum +{ + AM_IMPTAG_IMPLICATION, //implication record + AM_IMPTAG_IMPTWOLOCAL, //import record without locals + AM_IMPTAG_IMPTWLOCAL //import record with locals +} AM_ImpTag; + +//finding code for a predicate in the program context given by the value of +//the AM_ireg. +void AM_findCode(int constInd, CSpacePtr *clPtr, MemPtr *iptr) +{ + CSpacePtr myclPtr = NULL; + MemPtr myiptr = AM_ireg; + int size; + while (!AM_botIP(myiptr)) { + if ((size = AM_impPSTS(myiptr)) && + (myclPtr = (*(AM_impFC(myiptr)))(constInd,size,AM_impPST(myiptr)))) + break; + else myiptr = AM_impPIP(myiptr); + } + *clPtr = myclPtr; + *iptr = myiptr; +} +//creating the fixed part of a new implication/import record +void AM_mkImplRec(MemPtr ip, MemPtr sTab, int sTabSize, MEM_FindCodeFnPtr fnPtr) +{ + *((MemPtr *)ip) = AM_ereg; //CE: clause env + *(ip+1) = (Mem)AM_IMPTAG_IMPLICATION; //tag + *((MemPtr *)(ip+2)) = sTab; //PST: search table addr + *((MEM_FindCodeFnPtr *)(ip+3)) = fnPtr; //FC: find code fn ptr + *((MemPtr *)(ip+4)) = AM_ireg; //PIP: previous ip addr + *((int *)(ip+5)) = sTabSize; //PSTS: search table size +} + +//creating the fixed part of a new import record with local consts +void AM_mkImptRecWL(MemPtr ip, int npreds, MemPtr sTab, int sTabSize, + MEM_FindCodeFnPtr fnPtr) +{ + *((int *)ip) = npreds; //NPred: # preds + *(ip+1) = (Mem)AM_IMPTAG_IMPTWLOCAL; //tag + *((MemPtr *)(ip+2)) = sTab; //PST: search table addr + *((MEM_FindCodeFnPtr *)(ip+3)) = fnPtr; //FC: find code fn ptr + *((MemPtr *)(ip+4)) = AM_ireg; //PIP: previous ip addr + *((int *)(ip+5)) = sTabSize; //PSTS: search table size +} +//creating the fixed part of a new import record without local consts +void AM_mkImptRecWOL(MemPtr ip, int npreds, MemPtr sTab, int sTabSize, + MEM_FindCodeFnPtr fnPtr) +{ + *((int *)ip) = npreds; //NPred: # preds + *(ip+1) = (Mem)AM_IMPTAG_IMPTWOLOCAL;//tag + *((MemPtr *)(ip+2)) = sTab; //PST: search table addr + *((MEM_FindCodeFnPtr *)(ip+3)) = fnPtr; //FC: find code fn ptr + *((MemPtr *)(ip+4)) = AM_ireg; //PIP: previous ip addr + *((int *)(ip+5)) = sTabSize; //PSTS: search table size +} + +//creating a dummy import point +void AM_mkDummyImptRec(MemPtr ip) +{ + *((int *)ip) = 0; + *(ip+1) = (Mem)AM_IMPTAG_IMPTWOLOCAL; +} + + +/*initializing the next clause table in an implication/import record.*/ +void AM_mkImpNCLTab(MemPtr ip, MemPtr linkTab, int size) +{ + int constInd; + CSpacePtr clausePtr; + MemPtr iptr; + MemPtr nextCl = AM_impNCL(ip, size);//the first entry in the NCL table + size--; + for (; size >= 0; size--) { + constInd = MEM_implIthLT(linkTab, size); + AM_findCode(constInd, &clausePtr, &iptr); + if (clausePtr) { //if found + *((CSpacePtr *)nextCl) = clausePtr; + *((MemPtr *)(nextCl+1))= iptr; + } else { //not found + *((CSpacePtr *)nextCl) = AM_failCode; + *((MemPtr *)(nextCl+1))= NULL; + } + nextCl += AM_NCLT_ENTRY_SIZE; + } //for loop +} +//initializing the backchained vector in an import record +void AM_initBCKVector(MemPtr ip, int nclTabSize, int nSegs) +{ + MemPtr bcVecPtr = ip - nclTabSize - (AM_BCKV_ENTRY_SIZE * nSegs); + for (; (nSegs > 0); nSegs--){ + *((int *)bcVecPtr) = 0; + *((MemPtr *)(bcVecPtr+1)) = AM_breg; + bcVecPtr += AM_BCKV_ENTRY_SIZE; + } +} +//set back chained number in a given back chained field +void AM_setBCKNo(MemPtr bck, int n) { *((int *)bck) = n; } +//set most recent cp in a given back chained field +void AM_setBCKMRCP(MemPtr bck, MemPtr mrcp) { *((MemPtr *)(bck+1)) = mrcp; } +//initializing the universe indices in the symbol table entries for constants +//local to a module +void AM_initLocs(int nlocs, MemPtr locTab) +{ + nlocs--; + for (; nlocs >= 0; nlocs--) + AM_setCstUnivCount(MEM_impIthLCT(locTab, nlocs), AM_ucreg); +} + +//implication/import record access functions +//the ith entry of next clause tab +MemPtr AM_impNCL(MemPtr ip, int i) {return (ip - AM_NCLT_ENTRY_SIZE * i);} +//code in a next clause field +CSpacePtr AM_impNCLCode(MemPtr ncl) {return *((CSpacePtr *)ncl); } +//ip in a next clause field +MemPtr AM_impNCLIP(MemPtr ncl) {return *((MemPtr *)(ncl+1)); } +//the ith entry of back chained vec +MemPtr AM_cimpBCK(int i) +{ return (AM_cireg-AM_NCLT_ENTRY_SIZE*AM_cimpNPreds()-AM_BCKV_ENTRY_SIZE*i); } +//back chain num in a bck field +int AM_impBCKNo(MemPtr bck) {return *((int *)bck); } +//most recent cp is a bck field +MemPtr AM_impBCKMRCP(MemPtr bck) {return *((MemPtr *)(bck+1)); } +//clause env of in imp rec referred to by cireg +MemPtr AM_cimpCE() {return *((MemPtr *)AM_cireg); } +//# preds of impt rec +int AM_cimpNPreds() {return *((int *)AM_cireg); } + //search table addr +MemPtr AM_impPST(MemPtr ip) {return *((MemPtr *)(ip + 2)); } +//find code function pointer +MEM_FindCodeFnPtr AM_impFC(MemPtr ip) {return *((MEM_FindCodeFnPtr *)(ip + 3));} +//PIP in given imp point +MemPtr AM_impPIP(MemPtr ip) {return *((MemPtr *)(ip + 4)); } +//previous ip in the current top imp point +MemPtr AM_curimpPIP() {return *((MemPtr *)(AM_ireg + 4)); } +//search table size +int AM_impPSTS(MemPtr ip) {return *((int *)(ip + 5)); } + + +Boolean AM_isImptWL(MemPtr ip) { //is an imp rec a import rec w local + return ((AM_ImpTag)(*(ip+1)) == AM_IMPTAG_IMPTWLOCAL); +} +Boolean AM_isImptWOL(MemPtr ip){ //is an imp rec a import rec wo local + return ((AM_ImpTag)(*(ip+1)) == AM_IMPTAG_IMPTWOLOCAL); +} +Boolean AM_isImpl(MemPtr ip){ //is an imp rec a implication rec + return ((AM_ImpTag)(*(ip+1)) == AM_IMPTAG_IMPLICATION); +} +Boolean AM_isImpt(MemPtr ip){ //is an imp rec a import rec + return ((AM_ImpTag)(*(ip+1)) != AM_IMPTAG_IMPLICATION); +} + +Boolean AM_isImplCI(){ //is rec referred to by CI impl? + return ((AM_ImpTag)(*(AM_cireg+1)) == AM_IMPTAG_IMPLICATION); +} +Boolean AM_isCurImptWL(){ //is rec referred to by I impt with loc? + return ((AM_ImpTag)(*(AM_ireg+1)) == AM_IMPTAG_IMPTWLOCAL); +} + +/***************************************************************************/ +/* LIVE LIST OPERATIONS */ +/***************************************************************************/ +//live list is empty? +Boolean AM_empLiveList() { return (AM_llreg == DF_EMPTY_DIS_SET);} + +//live list not empty? +Boolean AM_nempLiveList(){ return (AM_llreg != DF_EMPTY_DIS_SET);} + +//add a dis pair to the live list when not knowning it is empty or not +void AM_addDisPair(DF_TermPtr tPtr1, DF_TermPtr tPtr2) +{ + MemPtr nhtop = AM_hreg + DF_DISPAIR_SIZE; + AM_heapError(nhtop); + DF_mkDisPair(AM_hreg, AM_llreg, tPtr1, tPtr2); + AM_llreg = (DF_DisPairPtr)AM_hreg; + AM_hreg = nhtop; +} + +/***************************************************************************/ +/* PDL OPERATIONS */ +/***************************************************************************/ +//pop (term/type) PDL +MemPtr AM_popPDL() { return (MemPtr)(*(--AM_pdlTop)); } +//push (term/type) PDL +void AM_pushPDL(MemPtr addr) { (*AM_pdlTop++) = (Mem)addr; } +//is empty PDL? +Boolean AM_emptyPDL() { return (AM_pdlTop == AM_pdlBot); } +//is not empty PDL? +Boolean AM_nemptyPDL() { return (AM_pdlTop > AM_pdlBot); } +//initialize PDL +void AM_initPDL() { AM_pdlTop = AM_pdlBot = AM_pdlBeg; } +//is empty type PDL? +Boolean AM_emptyTypesPDL() { return (AM_pdlTop == AM_typespdlBot); } +//is not empty type PDL? +Boolean AM_nemptyTypesPDL() { return (AM_pdlTop > AM_typespdlBot); } +//initialize type PDL +void AM_initTypesPDL() { AM_typespdlBot = AM_pdlTop; } +//recover type PDL to the status before type unification +void AM_resetTypesPDL() { AM_pdlTop = AM_typespdlBot; } + + +/****************************************************************************/ +/* RUN-TIME SYMBOL TABLES */ +/****************************************************************************/ +MEM_KstPtr AM_kstBase; //starting addr of the kind symbol table +MEM_TstPtr AM_tstBase; //starting addr of the type skel table +MEM_CstPtr AM_cstBase; //starting addr of the const symbol table + +/* Kind symbol table */ +char* AM_kstName(int n) //name of a type constructor in a given entry +{ + return MCSTR_toCString( + DF_strDataValue(((MEM_KstPtr)(((MemPtr)AM_kstBase) + + n*MEM_KST_ENTRY_SIZE)) -> name)); +} + +int AM_kstArity(int n) //arity of a type constructor in a given entry +{ + return ((MEM_KstPtr)(((MemPtr)AM_kstBase) + n*MEM_KST_ENTRY_SIZE)) -> arity; +} + +/* Type skeleton table */ +DF_TypePtr AM_tstSkel(int n) //type skeleton in a given entry +{ + return (DF_TypePtr)(((MemPtr)AM_tstBase) + n*MEM_TST_ENTRY_SIZE); +} + +/* Constant symbol table */ +char* AM_cstName(int n) //name of a constant in a given entry +{ + DF_StrDataPtr nameData = ((MEM_CstPtr)(((MemPtr)AM_cstBase) + + n * MEM_CST_ENTRY_SIZE)) -> name; + if (nameData) return MCSTR_toCString(DF_strDataValue(nameData)); + else return NULL; + //return MCSTR_toCString( + // DF_strDataValue(((MEM_CstPtr)(((MemPtr)AM_cstBase) + + // n*MEM_CST_ENTRY_SIZE)) -> name)); +} + +int AM_cstTyEnvSize(int n) //type environment size +{ + return ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))-> + typeEnvSize; +} +int AM_cstNeeded(int n) //neededness info +{ + return ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))-> + neededness; + +} +int AM_cstUnivCount(int n) //universe count +{ + return ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))->univCount; +} +int AM_cstPrecedence(int n) //precedence +{ + return ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))-> + precedence; +} +int AM_cstFixity(int n) //fixity +{ + return ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))->fixity; +} +int AM_cstTySkelInd(int n) //type skeleton index +{ + return ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))-> + tskTabIndex; +} + +void AM_setCstUnivCount(int n, int uc) //set universe count +{ + ((MEM_CstPtr)(((MemPtr)AM_cstBase)+n*MEM_CST_ENTRY_SIZE))->univCount = uc; +} + +/**************************************************************************** + * OVERFLOW ERROR FUNCTIONS * + ****************************************************************************/ +void AM_heapError(MemPtr p) //heap overflow +{ + if (AM_heapEnd < p) EM_error(SIM_ERROR_HEAP_OVERFL); +} +void AM_stackError(MemPtr p) //stack overflow +{ + if (AM_stackEnd < p) EM_error(SIM_ERROR_STACK_OVERFL); +} +void AM_pdlError(int n) //pdl overflow for n cells +{ + if (AM_pdlEnd < (AM_pdlTop + n)) EM_error(SIM_ERROR_PDL_OVERFL); +} +void AM_trailError(int n) //trail overflow for n cells +{ + if (AM_trailEnd < (AM_trreg + n)) + EM_error(SIM_ERROR_TRAIL_OVERFL); +} + + +/**************************************************************************** + * MISCELLANEOUS OTHER ERRORS * + ****************************************************************************/ +void AM_embedError(int n) //violation of max number of lambda embeddings +{ + if (n > DF_MAX_BV_IND) + EM_error(SIM_ERROR_TOO_MANY_ABSTRACTIONS, DF_MAX_BV_IND); +} +void AM_arityError(int n) // violation of max number of arity in applications +{ + if (n > DF_TM_MAX_ARITY) EM_error(SIM_ERROR_TOO_MANY_ARGUMENTS, + DF_TM_MAX_ARITY); +} +void AM_ucError(int n) //violation of maximum of universe count +{ + if (n == DF_MAX_UNIVIND) EM_error(SIM_ERROR_TOO_MANY_UNIV_QUANTS); +} + +#endif //ABSTMACHINE_C |
