-- File: SimMOSUtilities.mesa -- Adapted by Martin Newell, January 1980, from MIT's MOSSIM -- Last Updated: December 4, 1980 3:17 PM -- For DStar compile using the /l switch DIRECTORY InlineDefs: FROM "InlineDefs" USING[BITSHIFT, BITAND, BITOR, BITXOR], IODefs: FROM "IODefs" USING[WriteString, WriteChar], StringDefs: FROM "StringDefs" USING[EquivalentString], SystemDefs: FROM "SystemDefs" USING[AllocateHeapNode, FreeHeapNode], SimMOSAccessDefs: FROM "SimMOSAccessDefs" USING[AllocateNode, SetNode, GetNodeFlags, GetNodeName, GetNodeNext], SimMOSDefs: FROM "SimMOSDefs" USING[Node, Transistor], SimMOSUtilitiesDefs: FROM "SimMOSUtilitiesDefs" USING[List, ConsCell, AllButDescriptorFlags, InputFlag, OldVddFlag, HasInputVdd, HasInputGnd, PullupFlag, HasPullup, GateFlag, HasGateVdd, OldGndFlag, HasGateGnd, OldFlags, NewFlags, OldXFlag, RootFlag, SimAtomsLength]; SimMOSUtilities: PROGRAM IMPORTS InlineDefs, IODefs, SimMOSAccessDefs, SimMOSUtilitiesDefs, StringDefs, SystemDefs EXPORTS SimMOSUtilitiesDefs = BEGIN OPEN InlineDefs, IODefs, SimMOSAccessDefs, SimMOSDefs, SimMOSUtilitiesDefs, StringDefs, SystemDefs; SetDescriptor: PUBLIC PROCEDURE[flags: WORD] RETURNS[WORD] = --return flags with descriptor bits set according to type and old value BEGIN flags _ AllButDescriptorFlags[flags]; SELECT TRUE FROM BITAND[InputFlag,flags]#0 => flags _ BITOR[flags, IF BITAND[flags,OldVddFlag]#0 THEN HasInputVdd ELSE HasInputGnd]; BITAND[PullupFlag,flags]#0 => flags _ BITOR[flags,HasPullup]; BITAND[GateFlag,flags]#0 => flags _ BITOR[flags, SELECT TRUE FROM BITAND[flags,OldVddFlag]#0 => HasGateVdd, BITAND[flags,OldGndFlag]#0 => HasGateGnd, ENDCASE => HasGateVdd+HasGateGnd]; --slight kludge since don't know ENDCASE; RETURN[flags]; END; --Named-structure handler for Node structure, to make it print nicer PrintNode: PUBLIC PROCEDURE[n: Node] = BEGIN name: STRING _ [100]; nFlags: WORD _ GetNodeFlags[n]; WriteString[GetNodeName[n,name]]; WriteChar['[]; PrintNodeBits[OldFlags[nFlags]]; PrintNodeBits[NewFlags[nFlags]]; IF BITAND[nFlags,InputFlag]#0 THEN WriteChar['I]; IF BITAND[nFlags,GateFlag]#0 THEN WriteChar['G]; IF BITAND[nFlags,PullupFlag]#0 THEN WriteChar['P]; WriteChar[']]; END; --Print VGX from node bits PrintNodeBits: PUBLIC PROCEDURE[bits: WORD] = BEGIN WriteChar[SELECT TRUE FROM BITAND[bits,OldVddFlag]#0 => '1, BITAND[bits,OldVddFlag]#0 => '0, BITAND[bits,OldXFlag]#0 => 'X, ENDCASE => '.]; END; SimIntern: PUBLIC PROCEDURE[str: STRING, noCreate: BOOLEAN] RETURNS[n: Node] = --names are hashed and matched by EquivalentString BEGIN i,hash: CARDINAL _ 0; name: STRING _ [100]; FOR i IN [0..str.length) DO hash _ BITXOR[BITSHIFT[hash,1],BITOR[str[i],40B]]; ENDLOOP; --BITOR[str[i],40B] is to equate upper and lower case hash _ hash MOD SimAtomsLength; FOR n _ SimAtoms[hash],GetNodeNext[n] UNTIL n=NIL DO IF EquivalentString[str, GetNodeName[n,name]] THEN RETURN[n]; ENDLOOP; IF noCreate THEN RETURN[NIL]; n _ AllocateNode[str]; SetNode[node: n, nodeFlags: RootFlag, nodeEquivClass: n, nodeName: str, --text is copied by SetNode nodeNext: SimAtoms[hash]]; SimAtoms[hash] _ n; END; --List processing support AddToList: PUBLIC PROCEDURE[element: LONG POINTER, list: List] RETURNS[l: List] = BEGIN l _ AllocateHeapNode[SIZE[ConsCell]]; l^ _ [value: element, next: list]; END; RemoveFromList: PUBLIC PROCEDURE[element: LONG POINTER, list: List] RETURNS[l: List] = BEGIN lPtr: POINTER TO List; FOR lPtr _ @list, @(lPtr.next) UNTIL lPtr^=NIL DO IF lPtr.value=element THEN BEGIN lHold: List = lPtr^; lPtr^ _ lHold.next; FreeHeapNode[lHold]; EXIT; END; ENDLOOP; RETURN[list]; END; InList: PUBLIC PROCEDURE[element: LONG POINTER, list: List] RETURNS[BOOLEAN] = BEGIN l: List; FOR l _ list, l.next UNTIL l=NIL DO IF l.value=element THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE]; END; DestroyList: PUBLIC PROCEDURE[list: List] RETURNS[List] = BEGIN l,lnext: List; FOR l _ list, lnext UNTIL l=NIL DO lnext _ l.next; FreeHeapNode[l]; ENDLOOP; RETURN[NIL]; END; -- START Code -- -- initialize Global variables SimVddInputs: PUBLIC List _ NIL; -- list of nodes to be forced to vdd SimGndInputs: PUBLIC List _ NIL; -- list of nodes to be forced to gnd SimETrans: PUBLIC Transistor _ NIL; -- list of enhancement mode transistors SimDTrans: PUBLIC Transistor _ NIL; -- list of non-pullup depletion mode transistors SimXTrans: PUBLIC Transistor _ NIL; -- list of transistors with gate=X sGND: PUBLIC Node; -- ground node sVDD: PUBLIC Node; -- vdd node SimAtoms: PUBLIC ARRAY [0..SimAtomsLength) OF Node _ ALL[NIL]; --obarray for simulator nodes GateStorage: PUBLIC BOOLEAN _ TRUE; -- mode of charge storage END. (635)\9f1 6f0 164b9B45f1 2f0 22f1 3f0 177f1 16f0 8f1 16f0 73f1 10f0 8f1 10f0 25f1 8f0 9f1 4f0 8f1 6f0 9f1 4f0 223f1 2f0 5f1b6f0 9B40f1 24f0 9f1 4f0 33f1 6f0 9f1 4f0 34f1 16f0 2f1 18f0 9f1 4f0