DIRECTORY Rope; ChipTest: CEDAR DEFINITIONS = BEGIN Byte: TYPE = [0..377B]; Channel: TYPE = [0..119]; ByteIndex: TYPE = [0..LAST[Channel]/8]; WordIndex: TYPE = [0..LAST[Channel]/16]; ChannelVec: TYPE = PACKED ARRAY Channel OF BOOL _ ALL[FALSE]; ChannelVecRef: TYPE = REF READONLY ChannelVec _ NIL; RWChannelVecRef: TYPE = REF ChannelVec _ NIL; trues, falses: ChannelVecRef; ChannelByteVec: TYPE = PACKED ARRAY ByteIndex OF Byte _ ALL[0]; ChannelWordVec: TYPE = PACKED ARRAY WordIndex OF WORD _ ALL[0]; NSec: TYPE = INT; TesterOb: TYPE = RECORD [ d, a, b: RWChannelVecRef _ NIL, writeR: PROC [ t: Tester, reg, value: WORD ] _ NIL, flush: PROC [ t: Tester ] _ NIL, readI: PROC [ t: Tester ] RETURNS [ ChannelVec ] _ NIL, data: REF]; Tester: TYPE = REF TesterOb; Initialize: PROC [t: Tester, aToB, aToI: NSec _ 100]; PutABDelay, PutAIDelay: PROC [ t: Tester, d: NSec ]; PutDisables, PutABuf, PutBBuf: PROC [ t: Tester, p: ChannelVecRef, makeBufWindow: BOOL _ FALSE ] RETURNS [ window: Tester ]; GetDisables, GetABuf, GetBBuf, GetIBuf: PROC [ t: Tester ] RETURNS [ ChannelVecRef ]; Step: PROC [ t: Tester ]; CheckResult: TYPE = RECORD [checkId: NAT, window: Tester]; CheckI: PROC [ t: Tester, expected: ChannelVecRef, mask: ChannelVecRef _ NIL, makeBufWindow: BOOL _ FALSE ] RETURNS [CheckResult]; CheckFailure: ERROR [ checkId: CARDINAL, mask, expected, was: ChannelVecRef, errChannel: Channel ]; IllegalOp: ERROR; OpenTester: PROC [ server: Rope.ROPE _ NIL -- NIL means this machine -- ] RETURNS [ Tester ]; OpenBuffer: PROC [ base: Tester _ NIL ] RETURNS [ Tester ]; ExecuteBuffer: PROC [ t: Tester ]; DIP: PROC [pin: [1..120], size: [1..120] _ 120, pin1: [1..60] _ 1] RETURNS [Channel]; DIP8: PROC [pin: [1..8]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 8]]}; DIP14: PROC [pin: [1..14]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 14]]}; DIP16: PROC [pin: [1..16]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 16]]}; DIP20: PROC [pin: [1..20]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 20]]}; DIP22: PROC [pin: [1..22]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 22]]}; DIP24: PROC [pin: [1..24]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 24]]}; DIP28: PROC [pin: [1..28]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 28]]}; DIP40: PROC [pin: [1..40]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 40]]}; DIP48: PROC [pin: [1..48]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 48]]}; DIP64: PROC [pin: [1..64]] RETURNS [Channel] = INLINE {RETURN[DIP[pin, 64]]}; StaggeredDIP64: PROC [pin: [1..64]] RETURNS [Channel]; Leadless84: PROC [pin: [1..84]] RETURNS [Channel]; PinGridArray132: PROC [pin: [1..132]] RETURNS [Channel]; END. ôChipTest.mesa - Petit Dolphin chip tester client interface last edited by McCreight, January 20, 1984 3:56 pm The Petit Dolphin Chip Tester can test 120 pins in a device-under-test, and it tests each pin identically. Corresponding to each pin are two buffered output registers, called A and B, one buffered input register, called I, and a disable register, called D. The signal A=B is gated to the pin if D is false. The three buffered registers are loaded from/into their buffers by a strobe pulse S. S passes through one fixed and two programmable delay lines: an (essentially) fixed one for A, a programmable one for B, and a programmable one for I. The clock that copies A's buffer to A arrives first, followed in some order by the clock that copies B's buffer to B and the clock that copies the pin states into I. By this means a modest amount of dynamic timing can be generated and deduced. This first tester operates the tester in immediate mode: calling the procedure operates the tester right now. This immediate mode is completely general, but the speed at which successive put's and step's can be issued is limited to the speed at which the Dolphin can execute Cedar. This may be too slow to test chips with dynamic latches, especially in view of Cedar's interrupt processing. When it is necessary to issue successive put's and step's rapidly, see the buffered mode below. This second tester provides a buffer within which operations are saved for rapid execution by the ExecuteTesterBuffer procedure. These buffers conform to the specifications of the Dolphin ccaKludge instruction, whose microcode is in MesaIO.mc (see Fiala). The major limitation is that with the ccaKludge instruction you cannot ask about the results of the steps (except for the last one); you must predict the results (under a mask), and step execution will halt if masked prediction and reality do not match. This is fine for testing but not so good for debugging. During the building of a buffer, getIBuf has no meaning; after execution it is the value of i after the last successful step. If you make a buffer window from PutDisables, PutABuf, PutBBuf, or CheckI, then you can subsequently do the same operation to that window, which will immediately modify the appropriate place in the buffer. This is useful where you have a complicated test sequence with a few variables, such as address and data in a RAM test. There you might set up a buffer with two windows: a PutABuf one for address and CheckI one for check data. Then to check a location you would do a PutABuf to the first window, a CheckI to the second, and an ExecuteTesterBuffer to the whole buffer. These procedures map from socket pins on the multi-socket PC board that attaches to the front of the tester to tester channels. Ê[˜Jšœ;™;J˜Jšœ2™2Jšœ˜šÏk ˜ Jšœ˜—J˜šœ œ œ˜Jš˜J˜Jšœ˜™˜J˜Jšœœ ˜J˜Jšœ œ ˜Jšœ œœ ˜'Jšœ œœ˜(Jšœ œœœ œœœœ˜=Jš œœœœœ˜4Jšœœœœ˜-Jšœ˜J˜Jš œœœœ œœ˜?Jš œœœœ œœœ˜?Jšœœœ˜J˜šœ œœ˜Jšœœ˜Jšœœœœ˜3Jšœœœ˜ Jšœœœœ˜7Jšœœ˜ —Jšœœœ ˜J™šÏn œœ%˜5J˜—šœ ž œœ˜4J˜—Jš œžœœ/œœœ˜|šœžœœœ˜UJ˜—Jšžœœ˜J˜J˜šœ œœ œ˜:J˜—š žœœ=œœœœ˜‚J˜—Jšœœ œ<˜cJ˜Jšœ œ˜J˜Jšœé™éJ˜Jš ž œœœœÏcœœ ˜]J˜J™Jšœ·™·J™ÀJ˜Jšž œœœœ ˜;Jšž œœ˜"J˜J˜J˜Jšœ™J˜Jšœœ:œ ˜UJš žœœœ œœœ ˜JJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJš žœœœ œœœ ˜MJšžœœœ ˜6Jšž œœœ ˜2Jšžœœœ ˜8J˜Jšœ˜——…— fµ