DIRECTORY BitOps, RAMArray, RoseTypes, RoseCreate, RoseRun, SwitchTypes; RAMArrayTest: CEDAR PROGRAM IMPORTS BitOps, RoseCreate, RoseRun, RoseTypes SHARES RAMArray = BEGIN OPEN BitOps, RAMArray; PrimitiveRAMTest: RoseTypes.CellTestProc = BEGIN instructions: RAMArrayIORef _ NARROW[io]; state: RAMArrayStateRef _ NARROW[stateAsAny]; args: REF RAMArrayArgs _ NARROW[testeeType.typeData]; drive: Drive _ NARROW[driveAsAny]; BEGIN OPEN args, state, instructions; high: SwitchTypes.SwitchVal _ [[driveStrong, driveStrong, none], H, 0]; low: SwitchTypes.SwitchVal _ [[driveStrong, none, driveStrong], L, 0]; tristate: SwitchTypes.SwitchVal _ [[none, none, none], X, 0]; select0: NAT = 0; bit0: NAT = rows; Access: PROC [write: BOOL, row: NAT, data: LONG CARDINAL] = { SetColumnLines: PROC [value: SwitchTypes.SwitchVal] = { valueIndex: CARDINAL _ rows; FOR col:CARDINAL IN [0..columns) DO values[valueIndex] _ value; values[valueIndex+1] _ value; valueIndex _ valueIndex+2; ENDLOOP; }; d: BitDWord _ ILID[data, BitDWordZero, 32, 0, 32]; SetColumnLines[high]; [] _ RoseRun.Eval[handle]; SetColumnLines[tristate]; [] _ RoseRun.Eval[handle]; values[row] _ high; IF write THEN { valueIndex: CARDINAL _ rows; FOR col:CARDINAL IN [0..columns) DO IF EBFD[d, columns, col] THEN { values[valueIndex] _ high; values[valueIndex+1] _ low; } ELSE { values[valueIndex] _ low; values[valueIndex+1] _ high; }; valueIndex _ valueIndex+2; ENDLOOP; }; [] _ RoseRun.Eval[handle]; IF NOT write THEN { valueIndex: CARDINAL _ rows; FOR col:CARDINAL IN [0..columns) DO bitOfData: BOOL _ EBFD[d, columns, col]; IF (bitOfData AND (values[valueIndex].val # H OR values[valueIndex+1].val # L)) OR (NOT bitOfData AND (values[valueIndex].val # L OR values[valueIndex+1].val # H)) THEN RoseTypes.Stop["Read failed", $FailedAssertion]; valueIndex _ valueIndex+2; ENDLOOP; }; values[row] _ low; IF write THEN SetColumnLines[tristate]; [] _ RoseRun.Eval[handle]; }; Vdd _ high; Gnd _ low; IF rows<2 OR columns>32 THEN RoseTypes.Stop["Too many columns in RAM for this test procedure", $FailedAssertion]; FOR row:CARDINAL IN [0..rows) DO values[row] _ [[input, none, input], L, 0]; ENDLOOP; [] _ RoseRun.Eval[handle]; FOR row:CARDINAL IN [0..rows) DO IF values[row] # [[input, none, input], L, 0] THEN RoseTypes.Stop["select lines are crazy", $FailedAssertion]; ENDLOOP; Access[write: TRUE, row: 0, data: 0]; Access[write: TRUE, row: 1, data: LAST[LONG CARDINAL]]; Access[write: FALSE, row: 0, data: 0]; Access[write: FALSE, row: 1, data: LAST[LONG CARDINAL]]; values[select0] _ high; values[select0+1] _ high; [] _ RoseRun.Eval[handle]; { valueIndex: CARDINAL _ bit0; FOR col:CARDINAL IN [0..columns) DO IF values[valueIndex].val # X OR values[valueIndex+1].val # X THEN RoseTypes.Stop["data line is incorrect for multiple rows", $FailedAssertion]; valueIndex _ valueIndex+2; ENDLOOP; FOR row:CARDINAL IN [0..2) DO FOR col:CARDINAL IN [0..columns) DO memIndex: NAT _ row*columns+col; IF memory[memIndex].state # X OR memory[memIndex].nstate # X THEN RoseTypes.Stop["state bit is incorrect for multiple rows", $FailedAssertion]; ENDLOOP; ENDLOOP; }; END; END; ctest: RoseTypes.CellTest _ NEW[RoseTypes.CellTestRep _ ["Primitive", PrimitiveRAMTest, TRUE]]; ct: RoseTypes.CellType _ RoseCreate.GetCellType["RAMArray23dWd"]; [] _ RoseCreate.SetTest[ctest, ct, TRUE]; END. ήRAMArrayTest.mesa Last edited by Barth, March 14, 1985 8:18:07 pm PST precharge enable select line if write then enable write drivers if read then check data disable select line if write then disable write drivers Κœ˜Icodešœ™K™3K˜K˜šΟk ˜ Kšœ>˜>—K˜šœœ˜Kšœ'˜.Kšœ ˜—K˜šœ˜ Kšœ˜—K˜šœ*˜*Kš˜Kšœœ˜)Kšœœ ˜-Kšœœœ˜5šœœ ˜"Kšœœ˜%KšœAœ˜GKšœ@œ˜FKšœ7œ˜=Kšœ œ˜šœœ˜K˜š Οnœœ œœœœ˜=K˜šžœœ#˜7Kšœ œ˜šœœœ˜#Kšœ˜Kšœ˜Kšœ˜Kšœ˜—J˜K˜—Kšœœ ˜2K™ Kšœ˜J˜Kšœ˜J˜K™K™Kšœ˜K™"šœœ˜Kšœ œ˜šœœœ˜#šœœœ˜Kšœ˜Kšœ˜—šœœ˜Kšœ˜Kšœ˜K˜—Kšœ˜Kšœ˜—K˜—J˜K™šœœœ˜Kšœ œ˜šœœœ˜#Kšœ œœ˜(Kšœ œœœœœœ œœœœœœ1˜ΩKšœ˜Kšœ˜—K˜—K™Kšœ˜K™#Kšœœ˜'J˜K˜—J˜Jšœ ˜ Jšœ ˜ Jšœœ œU˜qšœœœ ˜ Jšœ%œ˜+Jšœ˜—J˜šœœœ ˜ Jšœ&œœ<˜nJšœ˜—Jšœœ˜%Jš œœœœœ˜7Jšœœ˜&Jš œœœœœ˜8Kšœ˜Kšœ˜J˜šœ˜Kšœ œ˜šœœœ˜#Kš œœœœœN˜Kšœ˜Kšœ˜—šœœœ˜šœœœ˜#Kšœ œ˜ Kš œœœœœN˜Kšœ˜—Kšœ˜—K˜——Kšœ˜—Kšœ˜—K˜Kšœœ9œ˜_KšœA˜AKšœ#œ˜)K˜Kšœ˜—…— ˆ