DIRECTORY IO, Rope, RoseTranslateTypes; IntTypesTranslation: CEDAR PROGRAM IMPORTS IO, RoseTranslateTypes = BEGIN ROPE: TYPE = Rope.ROPE; IntSignalType: TYPE = REF IntSignalTypeRep; IntSignalTypeRep: TYPE = RECORD [ bits: CARDINAL]; intTypes: LIST OF RoseTranslateTypes.SignalType _ NIL; one: REF ANY _ NEW [INT _ 1]; IntSignalTypeConstructor: RoseTranslateTypes.SignalTypeConstructor = BEGIN asAny: REF ANY _ RoseTranslateTypes.GetParm[1, "bits", parms, one]; bits: CARDINAL; type _ NIL; WITH asAny SELECT FROM ri: REF INT => bits _ ri^; ENDCASE => ERROR RoseTranslateTypes.TypeConstructionError["Signal Type INT not given an integer"]; FOR stl: LIST OF RoseTranslateTypes.SignalType _ intTypes, stl.rest WHILE stl # NIL DO istd: IntSignalType _ NARROW[stl.first.data]; IF istd.bits = bits THEN {type _ stl.first; EXIT}; ENDLOOP; IF type = NIL THEN intTypes _ CONS[ type _ NEW [RoseTranslateTypes.SignalTypeRep _ [ intTypeProcs, NEW[IntSignalTypeRep _ [bits]] ]], intTypes]; END; intTypeProcs: RoseTranslateTypes.SignalTypeProcs _ NEW [RoseTranslateTypes.SignalTypeProcsRep _ [ Info: IntTypeInfo, Describe: DescribeIntType, Cannonize: CannonizeIntType, MesaTypeDecl: MesaForIntType]]; IntTypeInfo: PROC [data: REF ANY] RETURNS [bitWidth: INT, roseType, mesaType: ROPE] = BEGIN intSignalType: IntSignalType _ NARROW[data]; bitWidth _ IF intSignalType.bits <= 16 THEN intSignalType.bits ELSE ((intSignalType.bits+15)/16)*16; roseType _ IO.PutFR["IntType[%g]", IO.int[intSignalType.bits]]; mesaType _ IF intSignalType.bits = 1 THEN "BOOLEAN" ELSE IF intSignalType.bits <= 16 THEN IO.PutFR["[0..%g]", IO.card[uppers[intSignalType.bits]]] ELSE IF intSignalType.bits <= 32 THEN "LONG CARDINAL" ELSE IO.PutFR["ARRAY [0 .. %g) OF CARDINAL", IO.card[(intSignalType.bits+15)/16]]; END; DescribeIntType: PROC [data: REF ANY] RETURNS [description: ROPE] = BEGIN intSignalType: IntSignalType _ NARROW[data]; description _ IO.PutFR["INT[%g]", IO.card[intSignalType.bits]]; END; CannonizeIntType: PROC [data: REF ANY] RETURNS [cannonized: REF ANY] = {cannonized _ data}; MesaForIntType: PROC [data: REF ANY] RETURNS [mesaTypeDecl: ROPE] = {mesaTypeDecl _ NIL}; uppers: ARRAY [1..16] OF CARDINAL = [1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535]; RoseTranslateTypes.RegisterSignalTypeConstructor["INT", IntSignalTypeConstructor]; RoseTranslateTypes.SetDefaultSignalType[IntSignalTypeConstructor[NEW [RoseTranslateTypes.ArgsRep _ [LIST[NEW [INT _ 1]]]]]]; END. RIntTypesTranslation.Mesa Last Edited by: Spreitzer, April 20, 1983 11:16 am Κj˜J™J™2J˜codešΟk ˜ Kšœ˜—K˜šΠbxœœ˜"Kšœœ˜ —K˜Kš˜K˜Kšœœœ˜K˜Kšœœœ˜+šœœœ˜!Kšœœ˜—K˜Kšœ œœ!œ˜6K˜Kš œœœœœ˜K˜šΟnœ,˜DKš˜Kšœœœ5˜CKšœœ˜Kšœœ˜ šœœ˜Kšœœœ˜KšœœR˜b—š œœœ4œœ˜VKšœœ˜-Kšœœœ˜2Kšœ˜—šœœ˜šœ œ˜šœœ&˜0Kšœ ˜ Kšœ˜"—Kšœ ˜ ——Kšœ˜—K˜šœ2˜2šœ+˜.K˜K˜K˜Kšœ˜——K˜šŸ œœœœœ œœ˜UKš˜Kšœœ˜,Kšœ œœœ!˜dKšœ œœ˜?Kšœ œœ œœœœœ#œœœœœ&œ#˜›Kšœ˜—K˜š Ÿœœœœœœ˜CKš˜Kšœœ˜,Kšœœœ˜?Kšœ˜—K˜šŸœœœœœœœ˜FK˜—K˜š Ÿœœœœœœ˜CKšœœ˜—K˜Kšœœ œœU˜vK˜KšœR˜RKš œAœ œœœ ˜|K˜Kšœ˜—…— ΐ |