本文整理汇总了C++中Gate::Evaluate方法的典型用法代码示例。如果您正苦于以下问题:C++ Gate::Evaluate方法的具体用法?C++ Gate::Evaluate怎么用?C++ Gate::Evaluate使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Gate
的用法示例。
在下文中一共展示了Gate::Evaluate方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Evaluate
bool Evaluate( Circuit& circuit)
{
int level=1;
multimap<int,Element*>:: iterator levelIter;
map<string,Wire*> ::iterator iter = (circuit.PriInputs).begin();
CIRCUIT_DFILE << "Circuit evaluation called for" << endl;
/// First propagate the values on primary inputs to the immediate branches. Not doing so leads to big bugs. Whenever a value is assigned
///to a wire, check for its branches and assign values to those too.
for ( iter = (circuit.PriInputs).begin(); iter != (circuit.PriInputs).end(); iter++)
{
Wire *outputWire = (iter->second);
Value curValue = outputWire->value;
if ((outputWire->outputs).size() > 1)
{
list<Element*>::iterator iterator = (outputWire->outputs).begin();
CIRCUIT_DFILE << "Evaluating stemouts of wire " << outputWire->id << endl;
/** Reasons for using dynamic cast:
* If the output wire has > 1 output, they are all bound to
* be wires.
* */
for (;iterator != (outputWire->outputs).end(); iterator++)
{
Wire* check = (dynamic_cast<Wire*>(*iterator));
assert(check);
CIRCUIT_DFILE << "Setting value of branch " << check->id << " of wire " << outputWire->id << " to " << (int) curValue << endl;
/// if the value of the wire is already set, don't set it again. (might be becuase it is faulty)
if (check->value == U)
check->value = curValue;
}
}
}
do
{
/* first and second are the end-point iterators that has been
* returned on qeurying the multimap on a value
*/
for (levelIter = ((circuit.Levels).equal_range(level)).first;
levelIter !=((circuit.Levels).equal_range(level)).second; levelIter++)
{
if ( (levelIter->second)->type == GATE)
{
Gate* curGate = dynamic_cast<Gate*>(levelIter->second);
Value curValue = curGate->Evaluate();
Wire* outputWire = curGate->output;
CIRCUIT_DFILE << "Setting value of wire " << outputWire->id << " to " << (int)curValue << endl;
// if the value of the wire is already set, don't set it again. (might be becuase it is faulty)
if (outputWire->value == U)
outputWire->value = curValue;
if ((outputWire->outputs).size() > 1)
{
list<Element*>::iterator iter = (outputWire->outputs).begin();
CIRCUIT_DFILE << "Evaluating stemouts of wire " << outputWire->id << endl;
/* Reasons for the dynamic cast:
* If the output wire has > 1 output, they are all bound to
* be wires.
* */
for (;iter != (outputWire->outputs).end(); iter++)
{
//cout << "output: " << (*iter)->id << endl;
Wire* check = (dynamic_cast<Wire*>(*iter));
assert(check);
CIRCUIT_DFILE << "Setting value of branch " << check->id << " of wire " << outputWire->id << " to " << (int) curValue << endl;
// if the value of the wire is already set, don't set it again. (might be becuase it is faulty)
if (check->value == U)
check->value = curValue;
}
}
}
else cout << "something wrong" << endl;
}
}while ( (circuit.Levels).find(++level) != (circuit.Levels).end() );
iter = (circuit.PriOutputs).begin();
return true;
}