Example #1
0
                public void VisitSignalRef(SignalRef signalRef)
                {
                    ISignalOrPortDescriptor desc = signalRef.Desc;
                    SignalRef remappedRef = signalRef.AssimilateIndices();
                    if (_vhdg._curComponent != null && 
                        !(signalRef.Desc is SignalArgumentDescriptor))
                    {
                        remappedRef = signalRef.RelateToComponent(_vhdg._curComponent);
                        if (remappedRef == null)
                            throw new InvalidOperationException("Referenced signal unknown to declaring component");
                    }
                    string name = remappedRef.Name;
                    StringBuilder sb = new StringBuilder();
                    var udesc = desc.GetUnindexedContainer();
                    sb.Append(_vhdg.MakeIDName(name, udesc.GetBoundSignal()));
                    if (!remappedRef.IsStaticIndex ||
                        !remappedRef.IndexSample.Equals(udesc.ElementType.Index))
                    {
                        foreach (Expression[] indexSpec in remappedRef.GetFullIndices())
                        {
                            if (indexSpec.Length == 0)
                                continue;

                            sb.Append("(");
                            bool first = true;
                            foreach (Expression index in indexSpec.Reverse())
                            {
                                if (first)
                                    first = false;
                                else
                                    sb.Append(", ");
                                sb.Append(index.ToString(_vhdg));
                            }
                            sb.Append(")");
                        }
                    }
                    switch (signalRef.Prop)
                    {
                        case SignalRef.EReferencedProperty.ChangedEvent:
                            Result = "-- changed event not supported";
                            break;

                        case SignalRef.EReferencedProperty.Cur:
                        case SignalRef.EReferencedProperty.Instance:
                        case SignalRef.EReferencedProperty.Next:
                            Result = sb.ToString();
                            break;

                        case SignalRef.EReferencedProperty.Pre:
                            sb.Append("'pre");
                            Result = sb.ToString();
                            break;

                        case SignalRef.EReferencedProperty.RisingEdge:
                            Result = "rising_edge(" + sb.ToString() + ")";
                            break;

                        case SignalRef.EReferencedProperty.FallingEdge:
                            Result = "falling_edge(" + sb.ToString() + ")";
                            break;

                        default:
                            throw new NotImplementedException();
                    }
                }