public IXILMapping TryAllocate(Component host, XILInstr instr, TypeDescriptor[] operandTypes, TypeDescriptor[] resultTypes, IProject targetProject)
        {
            var v = instr.Operand as FieldRef;

            if (v == null)
            {
                return(null);
            }

            var taSite = new InlineFieldMapperTransactionSite(this, host, v);

            switch (instr.Name)
            {
            case InstructionCodes.LoadVar:
                return(new ReadXILMapping(taSite));

            case InstructionCodes.StoreVar:
                return(new WriteXILMapping(taSite));

            default:
                return(null);
            }
        }
                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);
                        }
                    }
                }
        public IXILMapping TryAllocate(Component host, XILInstr instr, TypeDescriptor[] operandTypes, TypeDescriptor[] resultTypes, IProject targetProject)
        {
            var v = instr.Operand as FieldRef;
            if (v == null)
                return null;

            var taSite = new InlineFieldMapperTransactionSite(this, host, v);

            switch (instr.Name)
            {
                case InstructionCodes.LoadVar:
                    return new ReadXILMapping(taSite);

                case InstructionCodes.StoreVar:
                    return new WriteXILMapping(taSite);

                default:
                    return null;
            }
        }
 public WriteXILMapping(InlineFieldMapperTransactionSite taSite)
 {
     _taSite = taSite;
 }
                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);
                        }
                    }
                }
 public WriteXILMapping(InlineFieldMapperTransactionSite taSite)
 {
     _taSite = taSite;
 }