DIRECTORY BitOps, CoreCreate, Ports, RosemaryUser; Arbiter: CEDAR DEFINITIONS = BEGIN ArbNov87A: BOOL; -- 19 Jan 88 maxArbiters: NAT = 8; Arbiters: TYPE = [0..maxArbiters); OtherArbiters: TYPE = [0..maxArbiters-1); maxDevices: NAT = 8; Devices: TYPE = [0..maxDevices); Priority: TYPE = [0..8) _ 7; HoldPriority: Priority = 2; NoRequestPriority: Priority = 7; PacketLength: TYPE = MACHINE DEPENDENT {short2(0), long5(1)} _ short2; DevPortParams: TYPE = RECORD [ priority: Priority _ 7, length: PacketLength _ short2 ]; DevReqType: TYPE = MACHINE DEPENDENT {L(0), H(1)} _ L; DevReqCode: TYPE = MACHINE DEPENDENT {release(0), seize(1), reqL(2), reqH(3)} _ release; ReqCount: TYPE = [0..6] _ 0; ArbParams: TYPE = REF ArbParamsRec _ NIL; ArbParamsRec: TYPE = RECORD [ whoAmI: Arbiters _ 0, ports: ARRAY Devices OF ARRAY DevReqType OF DevPortParams ]; RequesterStateRec: TYPE = RECORD [ probs: REF _ NIL, state: REF _ NIL ]; never: INT = 10000000; ProbabilitiesRec: TYPE = RECORD [ -- one in x request: ARRAY DevReqType OF INT _ ALL[100], hold: INT _ 1000, stop: INT _ 1000, owner: INT _ never, shared: INT _ never ]; DSerialOut: NAT = 0; -- DBus wire indexes DSerialIn: NAT = 1; nDReset: NAT = 2; nDFreeze: NAT = 3; DExecute: NAT = 4; DAddress: NAT = 5; DShiftCK: NAT = 6; nOwnerOut: NAT = 0; -- OSSIn wire indexes nBOwnerIn: NAT = 1; nSharedOut: NAT = 2; nBSharedIn: NAT = 3; nSStopOut: NAT = 4; nBSStopIn: NAT = 5; nBOwnerOut: NAT = 0; -- OSSOut wire indexes nOwnerIn: NAT = 1; nBSharedOut: NAT = 2; nSharedIn: NAT = 3; nBSStopOut: NAT = 4; nSStopIn: NAT = 5; PriorityRecLen: NAT = 9; PriorityRec: TYPE = MACHINE DEPENDENT RECORD [ unused (0: 0..6): [0..128) _ 0, hiP (0: 7..9): [0..8) _ 0, hiLong (0: 10..10): BOOL _ FALSE, loP (0: 11..13): [0..8) _ 0, loLong (0: 14..14): BOOL _ FALSE, nFIFOEna (0: 15..15): BOOL _ FALSE ]; DefaultPriority: CARDINAL = LOOPHOLE[PriorityRec[hiP: 1, hiLong: TRUE, loP: 4, loLong: FALSE, nFIFOEna: TRUE]]; PRE: TYPE = INT _ DefaultPriority; PRA: TYPE = ARRAY Devices OF PRE; DBusInitList: TYPE = LIST OF REF ANY _ NIL; DBusInitItem: TYPE = RECORD [ addr: BitOps.BitWord _ 0, bits: Ports.BoolSequence ]; ArbInFrameCT: PROC [arbNo: INT _ 0, pra: PRA _ ALL[DefaultPriority]] RETURNS [ ct: CoreCreate.CellType ]; ArbExceptDBusCodeCT: PROC RETURNS [ ct: CoreCreate.CellType ]; ArbDBusCodeCT: PROC [arbNo: INT _ 0, pra: PRA _ ALL[DefaultPriority]] RETURNS [ ct: CoreCreate.CellType ]; SchematicCT: PROC [ cellName, designName: CoreCreate.ROPE ] RETURNS [ ct: CoreCreate.CellType ]; ResetSchematicCT: PROC [ cellName: CoreCreate.ROPE ]; CreateSanity: PROC RETURNS [ ct: CoreCreate.CellType ]; CreateWireAnd: PROC RETURNS [ ct: CoreCreate.CellType ]; ArbRandReq: PROC [ pre: PRE _ DefaultPriority, prob: REF _ NIL ] RETURNS [ ct: CoreCreate.CellType ]; GetSystemTests: PROC RETURNS [listOfTests: LIST OF CoreCreate.ROPE]; END. Arbiter.mesa Copyright c 1987 by Xerox Corporation. All rights reserved. McCreight May 13, 1987 3:32:57 pm PDT Last Edited by: McCreight January 19, 1988 1:59:55 pm PST Don Curry September 1, 1988 12:53:21 pm PDT implement the first fabricated version, or the current version. There are up to eight arbiters in a Dragon system. And each arbiter connects to up to eight requesting devices. 0 is best-priority If 2 is the best-priority request, then no grant is made. Owner, Shared, and SStop have are named as viewed by the arbiter's client (e.g., cache, memory controller, or what-have-you). Thus OwnerOut is sent from a cache to its arbiter. The "B" versions of those signals are as viewed from the arbiter, since they are strictly arbiter-to-arbiter negotiation. The notion is that one of these signals goes "out" until it reaches the backpanel, at which point is turns around and goes "in" until it reaches its destination. sanity check for not more than one grant, etc. wire-AND gate, mostly for simulation. Κ(˜šœ ™ Jšœ<™Jš ž œœ œ œœœ˜jJ˜šž œœ$œœ˜`Jšžœœœ˜5J˜—šž œœœ˜7J™.J˜—šž œœœ˜8J™%J˜—Jš ž œœœœœœ˜eJ˜Jš žœœœœœ œ˜DJ˜Jšœ˜—J˜—…— 6b