private void ButtonApplyClick(object sender, RoutedEventArgs e)
 {
     try {
         if (DialogTruthTable.MaxRows < this.TotalRows)
         {
             this.BuildTruthTable();
         }
         else
         {
             bool success;
             Predicate <TruthState> include = this.Filter(out success);
             if (include != null)
             {
                 this.TruthTable.Filter = o => {
                     if (o is TruthState)
                     {
                         TruthState state = (TruthState)o;
                         return((state.Output == null) || include(state));
                     }
                     return(false);
                 };
             }
             else
             {
                 this.TruthTable.Filter = null;
             }
         }
     } catch (Exception exception) {
         App.Mainframe.ReportException(exception);
     }
 }
            private void Build(Action <double> reportProgress, Func <bool> keepGoing, Predicate <TruthState> include, int maxCount)
            {
                this.Results     = new List <TruthState>();
                this.Oscillation = false;
                this.Trancated   = false;
                int inputCount  = this.Inputs.Count;
                int outputCount = this.Outputs.Count;

                if (0 < inputCount && 0 < outputCount)
                {
                    BigInteger end        = this.Start + this.Count;
                    BigInteger onePercent = this.Count / 100;
                    BigInteger count      = 0;
                    double     progress   = 0;

                    TruthState state = new TruthState(inputCount, outputCount);
                    for (BigInteger value = this.Start; value < end; value++)
                    {
                        if (maxCount <= this.Results.Count || !keepGoing())
                        {
                            this.Trancated = true;
                            break;
                        }
                        int bit = 0;
                        for (int i = this.Inputs.Count - 1; 0 <= i; i--)
                        {
                            InputPinSocket pin = this.Inputs[i];
                            int            v   = (int)((value >> bit) & int.MaxValue) & (pin.Pin.BitWidth < 32 ? (1 << pin.Pin.BitWidth) - 1 : ~0);
                            pin.Function.Value = v;
                            Tracer.Assert(pin.Function.Value == v, "Value get truncated");
                            bit += pin.Pin.BitWidth;
                        }
                        if (!this.CircuitState.Evaluate(true))
                        {
                            this.Oscillation = true;
                            break;
                        }
                        for (int i = 0; i < inputCount; i++)
                        {
                            state.Input[i] = this.Inputs[i].Function.Value;
                        }
                        for (int i = 0; i < outputCount; i++)
                        {
                            state.Result[i] = this.Outputs[i].Function.Pack();
                        }
                        if (!state.Unpack(this.Outputs.Select(o => o.Function.ParameterCount).ToArray()) || include == null || include(state))
                        {
                            this.Results.Add(state);
                            state = new TruthState(inputCount, outputCount);
                        }
                        if (reportProgress != null)
                        {
                            count++;
                            if (onePercent < count)
                            {
                                count = 0;
                                if (onePercent == BigInteger.Zero)
                                {
                                    Tracer.Assert(0 < this.Count && this.Count < 100);
                                    reportProgress((double)((value + 1 - this.Start) * 100) / (double)this.Count);
                                }
                                else
                                {
                                    reportProgress(Math.Min(++progress, 100));
                                }
                            }
                        }
                    }
                }
            }