public void AddAccessor(InlineFieldMapperTransactionSite taSite, bool needRead, bool needWrite) { var srWrEn = needWrite ? SignalRef.Create(taSite._wrEn, SignalRef.EReferencedProperty.Cur) : null; var lrWrEn = needWrite ? new LiteralReference(srWrEn) : null; var srDataIn = needWrite ? SignalRef.Create(taSite._dataIn, SignalRef.EReferencedProperty.Cur) : null; var lrDataIn = needWrite ? new LiteralReference(srDataIn) : null; var srDataOut = needRead ? SignalRef.Create(taSite._dataOut, SignalRef.EReferencedProperty.Next) : null; var hi = LiteralReference.CreateConstant(StdLogic._1); var elemType = taSite._literal.Type; var lrVar = new LiteralReference((Literal)taSite._literal); var convDataIn = needWrite ? IntrinsicFunctions.Cast(lrDataIn, typeof(StdLogicVector), elemType) : null; var convVar = needRead ? IntrinsicFunctions.Cast(lrVar, elemType.CILType, taSite._dataOut.ElementType) : null; bool isBool = taSite._literal.Type.CILType.Equals(typeof(bool)); var lr1 = LiteralReference.CreateConstant((StdLogicVector)"1"); var lr0 = LiteralReference.CreateConstant((StdLogicVector)"0"); if (needWrite) { BodyBuilder.If(Expression.Equal(lrWrEn, hi)); { if (isBool) { BodyBuilder.Store(taSite._literal, Expression.Equal(lrDataIn, lr1)); } else { BodyBuilder.Store(taSite._literal, convDataIn); } var diagOut = taSite.Host as ISupportsDiagnosticOutput; if (diagOut != null && diagOut.EnableDiagnostics) { Expression vref = new LiteralReference(taSite.Literal); var fref = taSite.Literal as FieldRef; var field = fref != null ? fref.FieldDesc : null; if (field != null && field.HasAttribute <ActualTypeAttribute>()) { var atype = field.QueryAttribute <ActualTypeAttribute>(); vref = IntrinsicFunctions.Cast(vref, vref.ResultType.CILType, atype.ActualType, true); } BodyBuilder.ReportLine(taSite.Literal.Name + " changed to ", vref); } } BodyBuilder.EndIf(); } if (needRead) { if (isBool) { BodyBuilder.If(lrVar); { BodyBuilder.If(lrVar); BodyBuilder.Store(srDataOut, lr1); } BodyBuilder.Else(); { BodyBuilder.Store(srDataOut, lr0); } BodyBuilder.EndIf(); } else { BodyBuilder.Store(srDataOut, convVar); } } }