コード例 #1
0
ファイル: InstructionGraph.cs プロジェクト: harnold/cobe
        public virtual InstructionGraph Clone(
            out IDictionary instructionMap,
            out IDictionary valueMap)
        {
            InstructionGraph clone = new InstructionGraph();

            instructionMap = new Hashtable();
            valueMap = new Hashtable();

            IList instructionNodes = GetInstructionNodes();
            IList valueNodes = GetValueNodes();

            foreach (InstructionNode instr in instructionNodes) {
                InstructionNode cloneInstr = (InstructionNode) instr.Clone();
                clone.AddNode(cloneInstr);
                instructionMap[instr] = cloneInstr;
            }

            foreach (ValueNode val in valueNodes) {
                ValueNode cloneVal = (ValueNode) val.Clone();
                clone.AddNode(cloneVal);
                valueMap[val] = cloneVal;
            }

            foreach (ValueNode val in inputValues)
                clone.inputValues.Add(valueMap[val]);

            foreach (ValueNode val in outputValues)
                clone.outputValues.Add(valueMap[val]);

            foreach (ValueNode val in valueNodes) {

                if (val is RegisterValueNode) {

                    RegisterSet assignableRegs =
                        (RegisterSet) assignableRegisters[val];

                    clone.assignableRegisters[valueMap[val]] =
                        assignableRegs.Clone();
                }
            }

            IDictionary valueProcessed = new Hashtable();

            foreach (ValueNode val in valueNodes)
                valueProcessed[val] = false;

            foreach (ValueNode val in outputValues) {
                CloneEdgesForValue(val, clone, instructionMap, valueMap,
                                   valueProcessed);
            }

            foreach (ValueNode val in cyclicDependencies.Keys) {
                clone.cyclicDependencies[valueMap[val]] =
                    valueMap[cyclicDependencies[val]];
            }

            return clone;
        }
コード例 #2
0
ファイル: GACodeGenerator.cs プロジェクト: harnold/cobe
 public virtual bool Optimize(
     out InstructionGraph instructionGraph,
     out RegisterAssignment registerAssignment,
     out InstructionSchedule instructionSchedule)
 {
     return selector.Optimize(out instructionGraph,
                              out registerAssignment,
                              out instructionSchedule);
 }
コード例 #3
0
ファイル: GAInstructionSelector.cs プロジェクト: harnold/cobe
        public virtual bool Optimize(
            out InstructionGraph instructionGraph,
            out RegisterAssignment registerAssignment,
            out InstructionSchedule instructionSchedule)
        {
            Run();

            if (Done != null)
                Done(this);

            if (BestGenome.IsValid) {
                instructionGraph    = BestGenome.InstructionGraph;
                registerAssignment  = BestGenome.RegisterAssignment;
                instructionSchedule = BestGenome.InstructionSchedule;
                return true;

            } else {
                instructionGraph    = null;
                instructionSchedule = null;
                registerAssignment  = null;
                return false;
            }
        }
コード例 #4
0
ファイル: InstructionGraph.cs プロジェクト: harnold/cobe
        protected virtual void CloneEdgesForValue(
            ValueNode val,
            InstructionGraph clone,
            IDictionary instructionMap,
            IDictionary valueMap,
            IDictionary valueProcessed)
        {
            if (!(bool) valueProcessed[val] && !val.IsInputValue()) {

                valueProcessed[val] = true;
                ValueNode cloneResValue = (ValueNode) valueMap[val];
                InstructionNode cloneInstr =
                    (InstructionNode) instructionMap[val.ProducingInstruction];

                clone.AddEdge(cloneInstr, cloneResValue);

                foreach (ValueNode opVal in val.ProducingInstruction.OperandValues) {
                    ValueNode cloneOpVal = (ValueNode) valueMap[opVal];
                    clone.AddEdge(cloneOpVal, cloneInstr);
                    CloneEdgesForValue(opVal, clone, instructionMap, valueMap,
                                       valueProcessed);
                }
            }
        }
コード例 #5
0
ファイル: GAScheduler.cs プロジェクト: harnold/cobe
        protected virtual void InitializeBase(
            MachineDescription machineDescription,
            InstructionGraph instructionGraph)
        {
            this.machineDescription = machineDescription;
            this.instructionGraph = instructionGraph;

            instructionNodes = instructionGraph.GetInstructionNodes();

            instructionsOnExUnit =
                new IList[machineDescription.ExecutionUnits];

            for (int i = 0; i < machineDescription.ExecutionUnits; i++) {
                instructionsOnExUnit[i] =
                    instructionGraph.GetInstructionNodesOnExUnit(i);
            }

            valueNodes = instructionGraph.GetValueNodes();

            registerValues = new ArrayList();

            foreach (ValueNode vNode in valueNodes) {
                if (vNode is RegisterValueNode)
                    registerValues.Add(vNode);
            }
        }
コード例 #6
0
ファイル: GAScheduler.cs プロジェクト: harnold/cobe
        public virtual void Initialize(
            MachineDescription machineDescription,
            InstructionGraph instructionGraph,
            SchedulingGenome initGenome)
        {
            InitializeBase(machineDescription, instructionGraph);
            InitializeDependencies();

            population = new SchedulingGenomePopulation(
                PopulationSize, this, initGenome, 1);

            InitializePopulation();
            InitializeGA();

            bestObjectiveMonitor = new double[MonitoredGenerations];

            if (Initialized != null)
                Initialized(this);
        }
コード例 #7
0
ファイル: SelectionGenome.cs プロジェクト: harnold/cobe
        public virtual void Initialize()
        {
            IDictionary valueInitialized = new Hashtable();

            foreach (ValueNode val in ValueNodes)
                valueInitialized[val] = false;

            foreach (ValueNode val in ProgramGraph.OutputValues)
                InitializeValue(val, valueInitialized);

            instructionSchedule = null;
            registerAssignment = null;
            instructionGraph = null;

            /*
            bestSchedulingGenome = null;
            */
        }
コード例 #8
0
ファイル: SelectionGenome.cs プロジェクト: harnold/cobe
        public virtual void Copy(IGenome otherGenome)
        {
            SelectionGenome other = (SelectionGenome) otherGenome;

            population = other.population;
            isValid = other.isValid;
            modified = other.modified;
            objective = other.objective;

            if (other.instructionGraph != null) {

                IDictionary instructionMap;
                IDictionary valueMap;

                instructionGraph =
                    other.instructionGraph.Clone(
                        out instructionMap, out valueMap);

                if (other.registerAssignment != null &&
                    other.instructionSchedule != null) {

                    registerAssignment =
                        other.registerAssignment.Clone(valueMap);

                    instructionSchedule =
                        other.instructionSchedule.Clone(instructionMap);

                    /*
                    bestSchedulingGenome =
                        other.bestSchedulingGenome.Clone(
                            instructionMap, valueMap);
                    */

                } else {
                    registerAssignment = null;
                    instructionSchedule = null;

                    /*
                    bestSchedulingGenome = null;
                    */
                }

            } else {
                instructionGraph = null;
            }

            foreach (OperationNode op in OperationNodes)
                selection[op] = other.selection[op];
        }
コード例 #9
0
ファイル: SelectionGenome.cs プロジェクト: harnold/cobe
        public virtual void BuildInstructionGraph()
        {
            IDictionary valueProcessed = new Hashtable();

            foreach (ValueNode val in ValueNodes)
                valueProcessed[val] = false;

            instructionGraph = new InstructionGraph();
            IDictionary valueNodeMap = new Hashtable();

            foreach (ValueNode val in ProgramGraph.GetValueNodes()) {
                if (val.OutNodes.Count == 0) {
                    BuildInstructionGraphForValue(
                        val, valueProcessed, valueNodeMap);
                }
            }

            foreach (ValueNode val in ProgramGraph.InputValues)
                instructionGraph.InputValues.Add(valueNodeMap[val]);

            foreach (ValueNode val in ProgramGraph.OutputValues)
                instructionGraph.OutputValues.Add(valueNodeMap[val]);

            ComputeAssignableRegisters();

            foreach (ValueNode val in ProgramGraph.CyclicDependencies.Keys) {
                ValueNode depVal = (ValueNode)
                    ProgramGraph.CyclicDependencies[val];
                instructionGraph.CyclicDependencies[
                    valueNodeMap[val]] = valueNodeMap[depVal];
            }

            InsertCyclicTransferInstructions();
        }