public IIR Execute(IIR predecessorIR)
        {
            AstIR astIR = predecessorIR as AstIR;
            if (astIR == null)
            {
                return null;
            }

            // Initialize Lowering Engine
            InitializeLoweringEngine();

            PhysicalIR physicalIR = new PhysicalIR(astIR);

            foreach (Task.AstPackageNode packageNode in astIR.AstRootNode.Packages)
            {
                if (packageNode.Emit)
                {
                    var root = physicalIR.InitializePackage(packageNode.Name);
                    PhysicalLoweringProcessor.Lower(packageNode, new TaskLoweringContext(root));
                }
            }

            return physicalIR;
        }