<> <> DIRECTORY Arpa, ArpaName, PBasics, Rope, SoftHdwSim, SunAuthUnix, SunPMap, SunPMapClient, SunRPC, SunRPCAuth, UserCredentials; SoftHdwSimImpl: CEDAR PROGRAM IMPORTS ArpaName, PBasics, SunAuthUnix, SunPMapClient, SunRPC, SunRPCAuth, UserCredentials EXPORTS SoftHdwSim = BEGIN OPEN SoftHdwSim; timeout: CARD = 2000; retry: CARD = 5; host: Rope.ROPE _ "cmsun"; program: INT = 555002207; version : INT = 1; CREATEBASE: INT = 1; FETCH: INT = 2; STORE: INT = 3; MASTERTOSLAVE: INT = 4; RELAX: INT = 5; CreateBase: PUBLIC PROC [sizes: ArrayPosition] RETURNS [array: ArrayBase] = { addr: Arpa.Address; status: ArpaName.ReplyStatus; myName, myPassword: Rope.ROPE; port: CARD _ 0; [addr, status] _ ArpaName.NameToAddress[host]; IF status#ok THEN ERROR; array _ NEW[ArrayBaseRec]; array.h _ SunRPC.Create[addr, PBasics.HFromCard16[SunPMap.udpPort]]; [myName, myPassword] _ UserCredentials.Get[]; array.c _ SunRPCAuth.Initiate[SunRPCAuth.nullFlavor, SunAuthUnix.FixNameForUnix[myName], myPassword]; port _ SunPMapClient.GetPort[array.h, array.c, program, version, SunPMap.ipProtocolUDP]; IF port = 0 THEN ERROR; array.h _ SunRPC.SetRemote[array.h, addr, PBasics.HFromCard16[PBasics.LowHalf[port]]]; SunRPC.StartCall[array.h, array.c, program, version, CREATEBASE]; SendArrayPosition[array.h, sizes]; [] _ SunRPC.SendCallAndReceiveReply[array.h, timeout, retry]; array.id _ SunRPC.GetCard32[array.h]; SunRPC.ReleaseReply[array.h]; }; Fetch: PUBLIC PROC [array: ArrayBase, bit: ArrayPosition] RETURNS [value: BOOL] = { SunRPC.StartCall[array.h, array.c, program, version, FETCH]; SunRPC.PutCard32[array.h, array.id]; SendArrayPosition[array.h, bit]; [] _ SunRPC.SendCallAndReceiveReply[array.h, timeout, retry]; value _ GetBool[array.h]; SunRPC.ReleaseReply[array.h]; }; Store: PUBLIC PROC [array: ArrayBase, bit: ArrayPosition, value: BOOL] = { SunRPC.StartCall[array.h, array.c, program, version, STORE]; SunRPC.PutCard32[array.h, array.id]; SendArrayPosition[array.h, bit]; SendBool[array.h, value]; [] _ SunRPC.SendCallAndReceiveReply[array.h, timeout, retry]; [] _ SunRPC.GetCard32[array.h]; -- throw away bogus return value to make RPC work SunRPC.ReleaseReply[array.h]; }; MasterToSlave: PUBLIC PROC [array: ArrayBase] = { SunRPC.StartCall[array.h, array.c, program, version, MASTERTOSLAVE]; SunRPC.PutCard32[array.h, array.id]; [] _ SunRPC.SendCallAndReceiveReply[array.h, timeout, retry]; [] _ SunRPC.GetCard32[array.h]; -- throw away bogus return value to make RPC work SunRPC.ReleaseReply[array.h]; }; Relax: PUBLIC PROC [array: ArrayBase] = { SunRPC.StartCall[array.h, array.c, program, version, RELAX]; SunRPC.PutCard32[array.h, array.id]; [] _ SunRPC.SendCallAndReceiveReply[array.h, timeout, retry]; [] _ SunRPC.GetCard32[array.h]; -- throw away bogus return value to make RPC work SunRPC.ReleaseReply[array.h]; }; SendArrayPosition: PROC [h: SunRPC.Handle, position: ArrayPosition] = { SunRPC.PutCard32[h, ORD[position.type]]; SunRPC.PutCard32[h, ORD[position.orientation]]; SendPosition[h, position.chip]; SendPosition[h, position.minorArray]; SendPosition[h, position.grain]; }; SendPosition: PROC [h: SunRPC.Handle, position: Position] = { SunRPC.PutInt32[h, position.x]; SunRPC.PutInt32[h, position.y]; }; SendBool: PROC [h: SunRPC.Handle, value: BOOL] = { SunRPC.PutInt32[h, IF value THEN 1 ELSE 0]; }; GetBool: PROC [h: SunRPC.Handle] RETURNS [value: BOOL] = { value _ IF SunRPC.GetCard32[h]=0 THEN FALSE ELSE TRUE; }; END.