Beispiel #1
0
 /// <summary>
 /// Writes a signal assignment target.
 /// </summary>
 /// <param name="target">the target</param>
 public virtual void writeSignalAssignmentTarget(ISignalAssignmentTarget target)
 {
     if (target is Aggregate)
     {
         writeExpression((Aggregate)target);
     }
     else if (target is Expression)
     {
         writeExpression((Expression)target);
     }
     else if (target == null)
     {
         //ignore
     }
     else
     {
         throw new ArgumentException("Unknown signal assignment target.");
     }
 }
        public void ObserveSignalAssignmentStatement(VHDLCompilerInterface compiler, SignalAssignment statement)
        {
            ISignalAssignmentTarget interpretedTarget = statement.Target;

            if (interpretedTarget is Expression)
            {
                string target = VHDLOperandGenerator.GetOperand(interpretedTarget as Expression, compiler, false);
                if ((statement.Waveform.Count == 1) && (statement.Waveform[0].After == null))
                {
                    string value = VHDLOperandGenerator.GetOperand(statement.Waveform[0].Value, compiler);
                    RegisterDutyCycleDelayEvent template = new RegisterDutyCycleDelayEvent(target, value);
                    code = template.TransformText();
                }
                else
                {
                    List <string> events = new List <string>();
                    foreach (VHDL.WaveformElement wfe in statement.Waveform)
                    {
                        events.Add(GetScheduledEvent(compiler, wfe));
                    }

                    if (statement.DelayMechanism == VHDL.DelayMechanism.TRANSPORT)
                    {
                        RegisterTransportDelayEvent template = new RegisterTransportDelayEvent(target, events);
                        code = template.TransformText();
                    }
                    else
                    {
                        RegisterInertialDelayEvent template;
                        if (statement.DelayMechanism.PulseRejectionLimit == null)
                        {
                            template = new RegisterInertialDelayEvent(target, events);
                        }
                        else
                        {
                            string Rejection = VHDLOperandGenerator.GetOperand(statement.DelayMechanism.PulseRejectionLimit, compiler);
                            template = new RegisterInertialDelayEvent(target, events, Rejection);
                        }
                        code = template.TransformText();
                    }
                }
            }
        }