예제 #1
0
        public GraphicOutput(BaseElement linkedObject)
            : base(linkedObject)
        {
            SignalOutput output = linkedObject as SignalOutput;

            if (output != null)
            {
                output.OnStateChanged      += new NotifyEvent(StateChangedEventHandler);
                output.OnSignalNameChanged += new NotifyEvent(SignalNameChangedEventHandler);
            }
        }
예제 #2
0
        private void SignalNameChangedEventHandler(object sender)
        {
            SignalOutput output = LinkedObject as SignalOutput;

            foreach (GraphicBaseElement gbe in Children)
            {
                if (gbe is TextElement)
                {
                    TextElement text = (gbe as TextElement);
                    if (text.Text == null || text.Text.Equals(output.SignalName) == false)
                    {
                        text.Text = output.SignalName;
                        if (OnUpdateDrawing != null)
                        {
                            OnUpdateDrawing(this, false);
                        }
                    }
                    break;
                }
            }
        }
예제 #3
0
        protected virtual void OnSignalOutput(int clockValue)
        {
            var args = new SignalOutputEventArgs(clockValue, _registers);

            SignalOutput?.Invoke(this, args);
        }
        private BaseElementData ConvertIOElement(BaseElement element)
        {
            BaseElementData elemData = null;

            if (element is Macro)
            {
                Macro            macro     = (Macro)element;
                MacroElementData macroData = new MacroElementData(macro.Name, macro.TypeName, macro.FileReference);
                macroData.Inputs            = ConvertTerminalArray(macro.Inputs);
                macroData.Outputs           = ConvertTerminalArray(macro.Outputs);
                macroData.Index             = macro.UpdateIndex;
                macroData.UnitDelay         = macro.UnitDelay;
                macroData.NegativeEdgeDelay = macro.NegEdgeDelay;
                macroData.PositiveEdgeDelay = macro.PosEdgeDelay;
                elemData = macroData;
            }
            if (element is Clock)
            {
                Clock     clock     = (Clock)element;
                ClockData clockData = new ClockData(clock.Name, clock.LowDuration, clock.HighDuration);
                clockData.Outputs = ConvertTerminalArray(clock.Outputs);
                elemData          = clockData;
            }
            if (element is SignalInput)
            {
                SignalInput      sigInput = (SignalInput)element;
                InputElementData inData   = new InputElementData(sigInput.Name, sigInput.SignalName);
                inData.Outputs = ConvertTerminalArray(sigInput.Outputs);
                elemData       = inData;
            }
            else if (element is ConstantInput)
            {
                ConstantInput     conInput = (ConstantInput)element;
                ConstantInputData inData   = new ConstantInputData(conInput.Name, conInput.State.ToString());
                inData.Outputs = ConvertTerminalArray(conInput.Outputs);
                elemData       = inData;
            }
            if (element is SignalOutput)
            {
                SignalOutput      sigOutput = (SignalOutput)element;
                OutputElementData outData   = new OutputElementData(sigOutput.Name, sigOutput.SignalName);
                outData.Inputs = ConvertTerminalArray(sigOutput.Inputs);
                elemData       = outData;
            }
            if (elemData == null && element is InputOutputElement)
            {
                InputOutputElement io     = (InputOutputElement)element;
                IOElementData      ioData = new IOElementData(io.Name, element.GetType().Name);
                ioData.Inputs            = ConvertTerminalArray(io.Inputs);
                ioData.Outputs           = ConvertTerminalArray(io.Outputs);
                ioData.Index             = io.UpdateIndex;
                ioData.UnitDelay         = io.UnitDelay;
                ioData.NegativeEdgeDelay = io.NegEdgeDelay;
                ioData.PositiveEdgeDelay = io.PosEdgeDelay;
                elemData = ioData;
            }
            if (elemData == null)
            {
                return(null);
            }
            if (element.LinkedObject != null)
            {
                GraphicInputOutputElement grIO = element.LinkedObject as GraphicInputOutputElement;
                elemData.X = grIO.Location.X;
                elemData.Y = grIO.Location.Y;
            }
            return(elemData);
        }
        private static GraphicBaseElement CreateElement(string name, BaseElement logic)
        {
            //Terminals
            if (name.Equals(typeof(Terminal).Name))
            {
                GraphicBaseElement element = new GraphicTerminal(logic);
                element.Name = logic.Name;
                return(element);
            }
            //Connections
            if (name.Equals(typeof(Connection).Name))
            {
                GraphicBaseElement element = new GraphicConnection(logic);
                element.Name = logic.Name;
                return(element);
            }
            //Macros
            if (name.Equals(typeof(Macro).Name))
            {
                Macro        macro        = logic as Macro;
                GraphicMacro graphicMacro = new GraphicMacro(logic, MacroCache.Instance.GetSymbol(macro.TypeName));

                return(graphicMacro);
            }
            //Gates
            if (name.Equals(typeof(AndGate).Name) || name.Equals(typeof(NandGate).Name))
            {
                GraphicInputOutputElement io = new GraphicInputOutputElement(logic);
                TextElement text             = new TextElement(@"&", new PointF(4, 4));
                io.AddChild(text);
                return(io);
            }
            if (name.Equals(typeof(OrGate).Name) || name.Equals(typeof(NorGate).Name))
            {
                GraphicInputOutputElement io = new GraphicInputOutputElement(logic);
                TextElement text             = new TextElement(@"≥1", new PointF(4, 4));
                io.AddChild(text);
                return(io);
            }
            if (name.Equals(typeof(BufferGate).Name) || name.Equals(typeof(NotGate).Name))
            {
                GraphicInputOutputElement io = new GraphicInputOutputElement(logic);
                TextElement text             = new TextElement(@"1", new PointF(4, 0));
                io.AddChild(text);
                return(io);
            }
            if (name.Equals(typeof(XorGate).Name))
            {
                GraphicInputOutputElement io = new GraphicInputOutputElement(logic);
                TextElement text             = new TextElement(@"=m", new PointF(4, 4));
                io.AddChild(text);
                return(io);
            }
            if (name.Equals(typeof(XnorGate).Name))
            {
                GraphicInputOutputElement io = new GraphicInputOutputElement(logic);
                TextElement text             = new TextElement(@"=", new PointF(4, 4));
                io.AddChild(text);
                return(io);
            }
            //if (name.Equals(typeof(Delay).Name))
            //{
            //    GraphicInputOutputElement io = new GraphicInputOutputElement(logic);
            //    TextElement text = new TextElement(@"|-|", new PointF(4, 4));
            //    io.AddChild(text);
            //    return io;
            //}
            //Signals
            if (name.Equals(typeof(Clock).Name))
            {
                Clock clock = (Clock)logic;
                GraphicInputOutputElement graphicClock = new GraphicClock(logic);
                return(graphicClock);
            }
            if (name.Equals(typeof(ConstantInput).Name) || name.Equals(typeof(SignalInput).Name))
            {
                GraphicInputOutputElement sig = new GraphicInput(logic);
                TextElement text = null;
                if (logic is SignalInput)
                {
                    text = new TextElement((logic as SignalInput).SignalName, new PointF(2, 0));
                }
                else
                {
                    text = new TextElement((logic as ConstantInput).State.ToString().Substring(0, 2), new PointF(2, 0));
                }
                if (text != null)
                {
                    sig.AddChild(text);
                }
                return(sig);
            }
            if (name.Equals(typeof(SignalOutput).Name))
            {
                SignalOutput output           = (SignalOutput)logic;
                GraphicInputOutputElement sig = new GraphicOutput(logic);
                TextElement text = new TextElement(output.SignalName, new PointF(2, 0));
                sig.AddChild(text);
                return(sig);
            }
            return(null);
        }