public static bool SimplifyOperands(ISignalSet signals) { if (signals.Count < 2) { return(false); } bool changed = false; Signal radix = signals[0]; if (Std.IsConstantAdditiveIdentity(radix) && Std.IsConstant(signals[1])) { if (Std.IsAlwaysNegative(signals[1])) { signals.Clear(); signals.Add(UndefinedSymbol.Constant); return(true); } signals.Clear(); signals.Add(radix); return(true); } if (Std.IsConstantMultiplicativeIdentity(radix)) { signals.Clear(); signals.Add(radix); return(true); } // Evaluate all but the first two operands -> nonnegative integers IntegerValue value = null; for (int i = signals.Count - 1; i > 1; i--) { Signal s = signals[i]; if (!Std.IsConstantNonnegativeInteger(s)) { if (changed) { if (!value.IsMultiplicativeIdentity) { signals.Add(Std.DefineConstant(value)); } return(true); } return(false); } signals.RemoveAt(i); value = ValueConverter <IntegerValue> .ConvertFrom(s.Value).PositiveIntegerPower((int)value.Value); changed = true; } // Evaluate the second operand -> integer (can also be negative) Signal exponent = signals[1]; if (!Std.IsConstantInteger(exponent)) { if (changed) { if (!value.IsMultiplicativeIdentity) { signals.Add(Std.DefineConstant(value)); } return(true); } return(false); } IntegerValue exponentValue = ValueConverter <IntegerValue> .ConvertFrom(exponent.Value); if (changed) { exponentValue = exponentValue.PositiveIntegerPower((int)value.Value); } // Special case: first operand is a power if (radix.IsDrivenByPortEntity(PowerArchitectures.EntityIdentifier) && radix.DrivenByPort.InputSignalCount == 2 && Std.IsConstantInteger(radix.DrivenByPort.InputSignals[1])) { exponentValue = exponentValue.Multiply(ValueConverter <IntegerValue> .ConvertFrom(radix.DrivenByPort.InputSignals[1].Value)); signals[0] = radix = radix.DrivenByPort.InputSignals[0]; changed = true; } // Evaluate the first operand if (!Std.IsConstantComplex(radix)) { if (changed) { if (!exponentValue.IsMultiplicativeIdentity) { signals[1] = Std.DefineConstant(exponentValue); } else { signals.RemoveAt(1); } return(true); } return(false); } IAccumulator acc = Accumulator <IntegerValue, RationalValue> .Create(radix.Value); acc = acc.IntegerPower((int)exponentValue.Value); signals.Clear(); signals.Add(Std.DefineConstant(acc.Value)); return(true); }