using System.Collections.Generic;
public class SteppingAdderActivation
public SteppingAdderActivation(
m_prevNumber = _prevNumber;
m_newNumber = _newNumber;
public SteppingAdder m_adder;
public class AndGateActivation
public AndGateActivation(
m_prevNumber = _prevNumber;
m_numberToAdd = _numberToAdd;
m_newNumber = _newNumber;
public int m_numberToAdd;
m_events = new List< IEvent >();
public void addEvent( IEvent _event )
foreach ( IEvent currentEvent in m_events )
SteppingAdderActivation steppingAdderActivation =
currentEvent as SteppingAdderActivation;
AndGateActivation andGateActivation =
currentEvent as AndGateActivation;
if ( (object)steppingAdderActivation != null )
print( steppingAdderActivation );
else if ( (object)andGateActivation != null )
print( andGateActivation );
private void print( SteppingAdderActivation _steppingAdderActivation )
StringBuilder sb = new StringBuilder();
, _steppingAdderActivation.m_adder.getName()
, _steppingAdderActivation.m_prevNumber
, _steppingAdderActivation.m_step
, _steppingAdderActivation.m_newNumber
Console.WriteLine( sb.ToString() );
private void print( AndGateActivation _andGateActivation )
StringBuilder sb = new StringBuilder();
bool overflow = _andGateActivation.m_overflow;
, _andGateActivation.m_adder.getName()
, _andGateActivation.m_prevNumber
, _andGateActivation.m_numberToAdd
, _andGateActivation.m_newNumber
sb.Append( " - overflow" );
Console.WriteLine( sb.ToString() );
public Logger getLogger()
public interface IElement
void addNumber( int _n );
void tryActivate( Environment _environment );
public abstract class ElementBase
public ElementBase( string _name )
public abstract int getNumber();
public abstract void addNumber( int _n );
public abstract bool hasImpetus();
public abstract void resetImpetus();
public abstract void tryActivate( Environment _environment );
public virtual void nextTurn()
public XGenerator( string _name )
m_drivenElements = new List< IElement >();
public override int getNumber()
public override void addNumber( int _n )
public override bool hasImpetus()
public override void resetImpetus()
public override void tryActivate( Environment _environment )
foreach ( IElement element in m_drivenElements )
element.tryActivate( _environment );
public override void nextTurn()
public void addDrivenElement( IElement _element )
m_drivenElements.Add( _element );
private List< IElement > m_drivenElements;
public override int getNumber()
public override void addNumber( int _n )
public override bool hasImpetus()
public override void resetImpetus()
public override void tryActivate( Environment _environment )
public override void nextTurn()
public virtual bool doesOverflow()
public class AdderWithOverflow
public AdderWithOverflow(
m_drivenElements = new List< IElement >();
public override void addNumber( int _n )
public override bool hasImpetus()
public override void resetImpetus()
public override void nextTurn()
public override bool doesOverflow()
public override void tryActivate( Environment _environment )
foreach ( IElement element in m_drivenElements )
element.tryActivate( _environment );
public void addDrivenElement( IElement _element )
m_drivenElements.Add( _element );
private List< IElement > m_drivenElements;
public class SteppingAdder
public override void tryActivate( Environment _environment )
Logger logger = _environment.getLogger();
int prevNumber = getNumber();
int newNumber = getNumber();
SteppingAdderActivation steppingAdderActivation = new SteppingAdderActivation(
logger.addEvent( steppingAdderActivation );
, bool _inverting = false
m_fromElement = _fromElement;
m_toElement = _toElement;
m_inverting = _inverting;
public override int getNumber()
public override void addNumber( int _n )
public override bool hasImpetus()
public override void resetImpetus()
public override void tryActivate( Environment _environment )
Logger logger = _environment.getLogger();
int numberToAdd = m_fromElement.getNumber();
numberToAdd *= m_modifier;
int prevNumber = m_toElement.getNumber();
m_toElement.addNumber( numberToAdd );
int newNumber = m_toElement.getNumber();
AndGateActivation andGateActivation = new AndGateActivation(
, m_toElement.doesOverflow()
logger.addEvent( andGateActivation );
private IElement m_fromElement;
private Adder m_toElement;
private bool m_inverting;
public override int getNumber()
public override void addNumber( int _n )
public override bool hasImpetus()
public override void resetImpetus()
public override void tryActivate( Environment _environment )
private int m_impetusNumber;
public Scheme( Environment _environment )
m_environment = _environment;
m_elementsToActivate = new List< IElement >();
m_elements = new List< IElement >();
public void addElement( IElement _element )
m_elements.Add( _element );
public void addElementToActivate( IElement _element )
m_elementsToActivate.Add( _element );
public Environment getEnvironment()
public void executeNImpetuses( int _number )
for ( int i = 0; i < _number; ++i )
IElement element = findElementToExecute();
if ( (object)element == null )
private IElement findElementToExecute()
for ( int i = m_elementsToActivate.Count - 1; i >= 0; --i )
IElement element = m_elementsToActivate[ i ];
if ( element.hasImpetus() )
private void execute( IElement _element )
if ( !_element.hasImpetus() )
_element.tryActivate( getEnvironment() );
foreach ( IElement element in m_elementsToActivate )
private Environment m_environment;
private List< IElement > m_elementsToActivate;
private List< IElement > m_elements;
public static void Main()
XGenerator xGenerator = new XGenerator( "x" );
Adder rg1 = new Adder( "RG1", rgInit1 );
Adder sum1 = new Adder( "Sum1", init0 );
AdderWithOverflow sum2 = new AdderWithOverflow( "Sum2", init1 );
Adder rg2 = new Adder( "RG2", init2 );
Adder rg_hidden = new Adder( "RG_Hidden", init3 );
AdderWithOverflow cntSqrt = new AdderWithOverflow( "Cnt_sqrt", init4 );
SteppingAdder cntRes = new SteppingAdder( "Cnt_res", init5, step5 );
AndGate andBetweenRG1_Sum1 = new AndGate( "&", rg1, sum1 );
AndGate andBetweenSum1_Sum2 = new AndGate( "&", sum1, sum2, false, 2 );
AndGate andBetweenRG2_Sum2 = new AndGate( "&", rg2, sum2, true, 2 );
AndGate andBetweenRGHidden_CntSqrt = new AndGate( "&", rg_hidden, cntSqrt );
AndGate andBetweenCntRes_CntSqrt = new AndGate( "&", cntRes, cntSqrt, true, 2 );
YReceiver yReceiver = new YReceiver( "y" );
xGenerator.addDrivenElement( andBetweenSum1_Sum2 );
xGenerator.addDrivenElement( andBetweenRG1_Sum1 );
sum2.addDrivenElement( andBetweenRGHidden_CntSqrt );
sum2.addDrivenElement( andBetweenRG2_Sum2 );
cntSqrt.addDrivenElement( yReceiver );
cntSqrt.addDrivenElement( cntRes );
cntSqrt.addDrivenElement( andBetweenCntRes_CntSqrt );
Environment environment = new Environment();
Scheme scheme = new Scheme( environment );
scheme.addElement( rg1 );
scheme.addElement( sum1 );
scheme.addElement( sum2 );
scheme.addElement( rg2 );
scheme.addElement( rg_hidden );
scheme.addElement( cntSqrt );
scheme.addElement( cntRes );
scheme.addElement( andBetweenRG1_Sum1 );
scheme.addElement( andBetweenSum1_Sum2 );
scheme.addElement( andBetweenRG2_Sum2 );
scheme.addElement( andBetweenRGHidden_CntSqrt );
scheme.addElement( andBetweenCntRes_CntSqrt );
scheme.addElement( yReceiver );
scheme.addElementToActivate( xGenerator );
scheme.addElementToActivate( sum2 );
scheme.addElementToActivate( cntSqrt );
scheme.executeNImpetuses( xMax );
int y = yReceiver.getNumber();
Console.WriteLine( "y = {0}", y );
scheme.getEnvironment().getLogger().print();
Console.WriteLine("Hello World");