private IGate EvaluateRecurse(ICodeLabelEvaluator cg, IGate g) { if (g.Type == GateType.Input) { if (g is LabelGate) { var lg = (LabelGate)g; lg.Label.Evaluate(cg); } } else { var list = new List <IGate>(); foreach (var i in g.GetInputs()) { var u = i; var l = _gc.GetScheduledLabel(u); if (null != l) { u = l; } else { u = EvaluateRecurse(cg, u); } list.Add(u); } g = SMG.Common.Gate.Compose(g.Type, list); } return(g); }