-- File: [Indigo]Dragon>DragonProcessorImpl1.sak -- Dragon processor with random fetch -- DIRECTORY DragonCache, DragonProcessor, SakuraRT, SimIO; DragonProcessorImpl1: MONITOR IMPORTS SakuraRT, SimIO EXPORTS DragonProcessor = { Processor: PUBLIC DEVICE = { IN ClockA, ClockB, Fault, Reject: BOOLEAN, InData: DragonCache.PbusType OUT Op: DragonCache.PbusOp, RQ: BOOLEAN, OutData: DragonCache.PbusType GUARDIAN {} CONTROL { Fetch: PROC [vp: LONG CARDINAL, bl: [0..37B], word: [0..3]]= { printval: LONG CARDINAL _ word+bl*4+vp*128; WHEN ClockB UP: { RQ _ TRUE; Op _ Fetch; OutData _ [Instruction[vp, bl, word]]}; DO WHEN ClockA UP: IF ~Reject THEN EXIT; ENDLOOP; SimIO.WF1[" Fetch started %ld*n", @printval]; WHEN ClockB UP: RQ _ FALSE; SimIO.WF1[" Fetch finished %ld*n", @printval]}; FetchAndRead: PROC [vp: LONG CARDINAL, bl: [0..37B], word: [0..3], data: LONG CARDINAL] = { printval: LONG CARDINAL _ word+bl*4+vp*128; RQ _ TRUE; Op _ Fetch; OutData _ [Instruction[vp, bl, word]]; DO WHEN ClockA UP: IF ~Reject THEN EXIT; ENDLOOP; SimIO.WF1[" Fetch started %ld*n", @printval]; WHEN ClockB UP: { SakuraRT.Delay[30]; WITH b: InData SELECT FROM Data => IF data # b.data THEN ERROR; ENDCASE => ERROR; RQ _ FALSE}; SimIO.WF1[" Fetch finished %ld*n", @printval]}; Read: PROC [data: LONG CARDINAL] = { DO WHEN ClockA UP: IF ~Reject THEN EXIT; ENDLOOP; WHEN ClockB UP: SakuraRT.Delay[30]; WITH b: InData SELECT FROM Data => IF data # b.data THEN ERROR; ENDCASE => ERROR}; RQ _ FALSE; WHEN ClockB UP: NULL; WHEN ClockB UP: NULL; Fetch[0,0,1]; FetchAndRead[0,0,2,37777777776B]; FetchAndRead[0,0,3,37777777775B]; FetchAndRead[0,1,0,37777777774B]; Read[37777777773B] } }; }.