DIRECTORY CD, CDCells, CMos, CDPinObjects, EuControl, EuGen, EUtils, PW, PWCmos, PWDescr, PWPins, Rope; EuGenImplA: CEDAR PROGRAM IMPORTS CMos, CDCells, EuControl, EUtils, PW, PWCmos, PWDescr, PWPins, Rope EXPORTS EuGen = BEGIN OPEN EuGen; regscdpd: PWDescr.Descriptor; regscdpu: PWDescr.Descriptor; regsInitialised: BOOL _ FALSE; EmptyDescrRamPD: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["PhA", "PhB", "nhold2BA", "nrejectBA", "DExecute", "DStateAddress", "aAdrHi", "aAdrLow", "bAdrHi", "bAdrLow", "cAdrHi", "cAdrLow", "spare4w", "spare1b"]]; PWDescr.SetTypeBit[descr, "PhA"]; PWDescr.SetTypeBit[descr, "PhB"]; PWDescr.SetTypeBit[descr, "nhold2BA"]; PWDescr.SetTypeBit[descr, "nrejectBA"]; PWDescr.SetTypeBit[descr, "DExecute"]; PWDescr.SetTypeInt[descr, "DStateAddress", 4]; PWDescr.SetTypeInt[descr, "aAdrHi", nbBitInRowDecoder]; PWDescr.SetTypeInt[descr, "aAdrLow", nbBitInColumnDecoder]; PWDescr.SetTypeInt[descr, "bAdrHi", nbBitInRowDecoder]; PWDescr.SetTypeInt[descr, "bAdrLow", nbBitInColumnDecoder]; PWDescr.SetTypeInt[descr, "cAdrHi", nbBitInRowDecoder]; PWDescr.SetTypeInt[descr, "cAdrLow", nbBitInColumnDecoder]; PWDescr.SetTypeInt[descr, "spare4w", 4]; PWDescr.SetTypeBit[descr, "spare1b"]; END; InitDescrRamPD: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ EmptyDescrRamPD[]; PWDescr.SetBit[descr, "PhA", TRUE]; END; EmptyDescrRamPU: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["nPhA", "nPhB", "Vbias"]]; PWDescr.SetTypeBit[descr, "nPhA"]; PWDescr.SetTypeBit[descr, "nPhB"]; PWDescr.SetTypeBit[descr, "Vbias"]; END; InitDescrRamPU: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ EmptyDescrRamPU[]; PWDescr.SetTypeBit[descr, "nPhA", FALSE]; PWDescr.SetTypeBit[descr, "nPhB", TRUE]; PWDescr.SetTypeBit[descr, "Vbias", TRUE]; END; EmptyDescrRegsPD: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["PhA", "PhB", "nhold2BA", "nrejectBA", "DExecute", "DStateAddress", "EUAluLeftSrc1BA", "EUAluRightSrc1BA", "EUStore2ASrc1BA", "EUSt3AisCBus2BA", "EURes3AisCBus2BA", "FDInsert", "FDMask", "FDShift", "EUAluOp2AB", "EULoadField3BA", "EUWriteToPBus3AB", "EURes3BisPBus3AB"]]; PWDescr.SetTypeBit[descr, "PhA"]; PWDescr.SetTypeBit[descr, "PhB"]; PWDescr.SetTypeBit[descr, "nhold2BA"]; PWDescr.SetTypeBit[descr, "nrejectBA"]; PWDescr.SetTypeBit[descr, "DExecute"]; PWDescr.SetTypeInt[descr, "DStateAddress", 4]; PWDescr.SetTypeInt[descr, "EUAluLeftSrc1BA", 2]; PWDescr.SetTypeInt[descr, "EUAluRightSrc1BA", 2]; PWDescr.SetTypeInt[descr, "EUStore2ASrc1BA", 2]; PWDescr.SetTypeBool[descr, "EUSt3AisCBus2BA"]; PWDescr.SetTypeBool[descr, "EURes3AisCBus2BA"]; PWDescr.SetTypeBool[descr, "FDInsert"]; PWDescr.SetTypeInt[descr, "FDMask", 6]; PWDescr.SetTypeInt[descr, "FDShift", 6]; PWDescr.SetTypeInt[descr, "EUAluOp2AB", 5]; PWDescr.SetTypeBit[descr, "EULoadField3BA"]; PWDescr.SetTypeBool[descr, "EUWriteToPBus3AB"]; PWDescr.SetTypeBool[descr, "EURes3BisPBus3AB"]; END; EmptyDescrRegsPU: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["nPhA", "nPhB", "Vbias"]]; PWDescr.SetTypeBit[descr, "nPhA"]; PWDescr.SetTypeBit[descr, "nPhB"]; PWDescr.SetTypeBit[descr, "Vbias"]; END; PipeLineRegsGen: PUBLIC PROC [design: CD.Design] RETURNS [pipe: PW.ObPtr] = BEGIN leftOp2AB, rightOp2AB, store2AB, store2BA, store3AB: PW.ObPtr; LeftOp2ABGen: PROC RETURNS [leftOp2AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; -- remember that AbutY builds UP PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 0]; -- aBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 1]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 2]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 0, 0]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [inListOb: LIST["ap", "r", "c"], out: "opL", ctrlListOb: listOb]]; leftOp2AB _ EUtils.MakeRegWithDBus[design, regD, lOp2AB]; END; RightOp2ABGen: PROC RETURNS [rightOp2AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 0]; -- bBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 1]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 2]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 3]; -- kBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 0, 0]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [inListOb: LIST["bs", "r", "c", "k"], out: "opR", ctrlListOb: listOb]]; rightOp2AB _ EUtils.MakeRegWithDBus[design, regD, rOp2AB]; END; Store2ABGen: PROC RETURNS [store2AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 0]; -- bBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 1]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 2]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 0, 0]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["bs", "r", "c"], out: "down", ctrlListOb: listOb, interruptBuses: LIST["apBus", "bsBus"]]]; store2AB _ EUtils.MakeReg[design, regD]; END; Store2BAGen: PROC RETURNS [store2BA: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; -- no control regD _ NEW[EUtils.RegDescrRec _ [inListOb: LIST["top"], out: "down", ctrlListOb: listOb, cutTopBot: TRUE]]; store2BA _ EUtils.MakeReg[design, regD ]; END; Store3ABGen: PROC RETURNS [store3AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EUSt3AisCBus2BA", TRUE]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetBool[regscdpd, "EUSt3AisCBus2BA", FALSE]; -- store2BA listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EUSt3AisCBus2BA", FALSE, FALSE]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["top", "c"], out: "ap", ctrlListOb: listOb, interruptBuses: LIST["downBus"]]]; store3AB _ EUtils.MakeRegWithDBus[design, regD, st3AB]; END; PW.Output["The top pipeline registers", "\n"]; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhB", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhA", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; PWDescr.SetBit[regscdpd, "nrejectBA", TRUE]; leftOp2AB _ LeftOp2ABGen[]; rightOp2AB _ RightOp2ABGen[]; store2AB _ Store2ABGen[]; store3AB _ Store3ABGen[]; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhA", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhB", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; -- really??? store2BA _ Store2BAGen[]; pipe _ PW.AbutY[design, store3AB, store2BA, store2AB, rightOp2AB, leftOp2AB]; PW.RenameObject[design, pipe, "pipelineRegisters"]; END; ResultRegsGen: PUBLIC PROC [design: CD.Design] RETURNS [resultRegs: PW.ObPtr] = BEGIN result2BA, result3AB, result3BA, dataDriver, addrDriver: PW.ObPtr; Result2BAGen: PROC RETURNS [result2BA: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["bs"], out: "r", ctrlListOb: listOb, interruptBuses: LIST["opLBus", "opRBus", "downBus"]]]; result2BA _ EUtils.MakeRegWithDBus[design, regD, r2BA]; END; Result3ABGen: PROC RETURNS [result3AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EURes3AisCBus2BA", FALSE]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EURes3AisCBus2BA", TRUE]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetBool[regscdpd, "EURes3AisCBus2BA", FALSE, FALSE]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["r", "c"], out: "opL", ctrlListOb: listOb]]; result3AB _ EUtils.MakeRegWithDBus[design, regD, r3AB]; END; Result3BAGen: PROC RETURNS [result3BA: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", FALSE]; -- from result3AB (opL) listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", TRUE]; -- pPort (opR) listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", FALSE, FALSE]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["opL", "top"], out: "c", ctrlListOb: listOb]]; result3BA _ EUtils.MakeRegWithDBus[design, regD, r3BA]; END; BottomGen: PROC RETURNS [bottom: PW.ObPtr] = BEGIN BottomCtrlGen: PROC RETURNS [bottomCtrl: PW.ObPtr] = BEGIN index: INT _ 1; GndProc: PW.SelectNamesProc = {keepIt _ Rope.Equal[name, "gnd"]}; RenameEULoadField3BA: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "EULoadField3BA"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameNRejectBA: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "nrejectBA"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameNHold2BA: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "nhold2BA"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameEURes3BisPBus3AB: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "EURes3BisPBus3AB"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameEUWriteToPBus3AB: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "EUWriteToPBus3AB"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameDExecute: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "DExecute"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; listOb: PW.ListOb _ NIL; gndConnect, gndRect, wires, wire: PW.ObPtr; size: CD.Position; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpd, "EULoadField3BA", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameEULoadField3BA], listOb]; PWDescr.SetBit[regscdpd, "EULoadField3BA", FALSE]; PWDescr.SetBit[regscdpd, "nrejectBA", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBit[regscdpd, "nrejectBA", FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameNRejectBA], listOb]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBit[regscdpd, "nhold2BA", FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameNHold2BA], listOb]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", FALSE, FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameEURes3BisPBus3AB], listOb]; PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", FALSE, FALSE]; -- clean-up listOb _ CONS[PWPins.RenamePins[design, wire, RenameEUWriteToPBus3AB], listOb]; PWDescr.SetBit[regscdpd, "DExecute", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBit[regscdpd, "DExecute", FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameDExecute], listOb]; FOR i: INT IN [0..4) DO RenameDStateAddress: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ PWPins.Index["DStateAddress", i]; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; PWDescr.SetInt[regscdpd, "DStateAddress", index, index]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameDStateAddress], listOb]; index _ 2*index; ENDLOOP; PWDescr.SetInt[regscdpd, "DStateAddress", 0, 0]; wires _ PW.AbutListY[design, listOb]; gndConnect _ EUtils.CtrlFiller[design, wires, bottomDataPath, GndProc]; size _ PW.Size[gndConnect]; gndRect _ PWCmos.Rect[CMos.met2, [size.x, size.y-10*l]]; -- hack!!! PW.IncludeInCell[design, gndConnect, gndRect, [0, 0]]; [] _ CDCells.RepositionCell[gndConnect, design]; bottomCtrl _ PW.AbutY[design, gndConnect, wires]; END; bottomDataPath, botDP: PW.ObPtr; listOb: PW.ListOb _ NIL; bottomDataPath _ PW.Get[design, "bottomDataPath"]; FOR i: INT IN [0..nbSlices) DO RenameEPData: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "EPData"] => newRope _ PWPins.Index[oldRope, nbSlices-i-1]; ENDCASE => newRope _ oldRope;}; listOb _ CONS[PWPins.RenamePins[design, bottomDataPath, RenameEPData], listOb]; ENDLOOP; botDP _ PW.AbutListX[design, listOb]; bottom _ EUtils.Assemble[design, BottomCtrlGen[], botDP,, Bottom]; END; AddrDriverGen: PROC RETURNS [addrDriver: PW.ObPtr] = BEGIN listOb: PW.ListOb _ NIL; listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; addrDriver _ EUtils.MakeTstDriver[design: design, in: "r", out: "downOut", ctrlListOb: listOb]; END; DataDriverGen: PROC RETURNS [dataDriver: PW.ObPtr] = BEGIN listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", TRUE]; listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", FALSE, FALSE]; -- clean-up dataDriver _ EUtils.MakeTstDriver[design: design, in: "ap", out: "downOut", ctrlListOb: listOb]; END; PW.Output["The bottom pipeline registers", "\n"]; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhB", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhA", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; PWDescr.SetBit[regscdpd, "nrejectBA", TRUE]; result3AB _ Result3ABGen[]; addrDriver _ AddrDriverGen[]; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhA", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhB", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; -- really??? result2BA _ Result2BAGen[]; result3BA _ Result3BAGen[]; dataDriver _ DataDriverGen[]; resultRegs _ PW.AbutY[design, BottomGen[], dataDriver, addrDriver, result3BA, result3AB, result2BA]; PW.RenameObject[design, resultRegs, "resultRegisters"]; END; END. NEuGenImplB.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Last Edited by: Monier, July 9, 1985 3:56:00 pm PDT -- Control descriptors -- And now the pipeline registers store2AB _ EUtils.MakeRegWithDBus[design, regD, st2AB]; -- PhA latches -- PhB latches -- no special control -- wires: connect all leftover wires -- EULoadField3BA -- nrejectBA -- nhold2BA -- EURes3BisPBus3AB -- EUWriteToPBus3AB -- DExecute -- DStateAddress -- Assemble all these wires -- Now the m2 comb -- Cache access: address, always on PhA -- Cache access: data -- PhA latch -- PhB latches ΚΥ˜– "Cedar" stylešœ™Jšœ Οmœ1™šŸ œžœžœ žœ ˜3Jšž˜Jšœ˜Jšœžœ žœΟc ˜9Jšœ0 ˜7Jšœ žœ,žœ ˜HJšœ0 ˜7Jšœ žœ5˜BJšœ0 ˜7Jšœ žœ,žœ ˜HJšœ2  ˜>Jšœžœ!žœ3˜bJšœ9˜9Jšžœ˜—šŸ œžœžœžœ ˜5Jšž˜Jšœ˜Jšœžœ žœ˜Jšœ1 ˜8Jšœ žœ5˜BJšœ1 ˜8Jšœ žœ,žœ ˜HJšœ1 ˜8Jšœ žœ5˜BJšœ1 ˜8Jšœ žœ,žœ ˜HJšœ4  ˜?Jšœžœ!žœ8˜gJšœ:˜:Jšžœ˜—šŸ œžœžœ žœ ˜1Jšž˜Jšœ˜Jšœžœ žœ˜Jšœ0 ˜7Jšœ žœ,žœ ˜HJšœ0 ˜7Jšœ žœ5˜BJšœ0 ˜7Jšœ žœ,žœ ˜HJšœ3  ˜>šœžœ˜!Jšœ žœ˜ Jšœ ˜ Jšœ˜Jšœžœ˜)—Jšœ7™7Jšœ(˜(Jšžœ˜—šŸ œžœžœ žœ ˜1Jšž˜Jšœ˜Jšœžœ žœ˜Jšœ žœ6  ˜PJšœžœ!žœ5žœ˜kJšœ)˜)Jšžœ˜—šŸ œžœžœ žœ ˜1Jšž˜Jšœ˜Jšœžœ žœ˜Jšœ-žœ ˜;Jšœ žœ5˜BJšœ-žœ  ˜@Jšœ žœ,žœ ˜HJšœ-ž œ  ˜Gšœžœ˜!Jšœ žœ˜Jšœ ˜ Jšœ˜Jšœžœ˜"—Jšœ7˜7Jšžœ˜—J˜Jšžœ,˜.Jšœ˜Jšœ˜Jšœ!žœ˜'Jšœ"žœ˜(Jšœ žœ˜&Jšœ%žœ˜+Jšœ&žœ˜,J™Jšœ˜Jšœ˜Jšœ˜Jšœ˜J™Jšœ˜Jšœ˜Jšœ!žœ˜'Jšœ"žœ˜(Jšœ žœ˜&Jšœ%žœ  ˜9Jšœ˜šœžœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ ˜ —Jšžœ1˜3Jšžœ˜—J˜š Ÿ œž œ žœ žœžœ ˜PJšž˜Jšœ9žœ˜BšŸ œžœžœ žœ ˜3Jšž˜Jšœ˜Jšœžœ žœ˜Jš ™Jšœ žœ5˜Bšœžœ˜!Jšœ žœ˜Jšœ ˜ Jšœ˜Jšœžœ"˜6—Jšœ7˜7Jšžœ˜—šŸ œžœžœ žœ ˜3Jšž˜Jšœ˜Jšœžœ žœ˜Jšœ.žœ ˜=Jšœ žœ,žœ ˜HJšœ.žœ ˜˜>Jšœ.žœ˜2Jšžœ˜——–[]šŸœ˜%šœžœžœž˜Jšœ9˜9Jšœ.žœ˜2Jšžœ˜——–[]šŸœ˜$šœžœžœž˜Jšœ8˜8Jšœ.žœ˜2Jšžœ˜——–[]šŸœ˜,šœžœžœž˜Jšœ@˜@Jšœ.žœ˜2Jšžœ˜——šŸœ˜,šœžœžœž˜Jšœ@˜@Jšœ.žœ˜2Jšžœ˜——–[]šŸœ˜$šœžœžœž˜Jšœ8˜8Jšœ.žœ˜2Jšžœ˜——Jšœžœ žœ˜Jšœ"žœ˜+Jšœžœ ˜Jšœ$™$Jšœ˜Jšœ˜Jšœ™Jšœ+žœ˜1Jšœ5˜5Jšœ žœ@˜MJšœ+žœ˜2Jšœ ™ Jšœ&žœ˜,Jšœ5˜5Jšœ&žœ˜-Jšœ žœ;˜HJšœ ™ Jšœ%žœ˜+Jšœ5˜5Jšœ%žœ˜,Jšœ žœ:˜GJšœ™Jšœ.žœ˜4Jšœ5˜5Jšœ.ž œ˜