[Avida-SVN] r3292 - in branches/matt/CompeteInstSet/source: cpu main

ruppmatt at myxo.css.msu.edu ruppmatt at myxo.css.msu.edu
Fri Jun 5 13:22:28 PDT 2009


Author: ruppmatt
Date: 2009-06-05 16:22:28 -0400 (Fri, 05 Jun 2009)
New Revision: 3292

Modified:
   branches/matt/CompeteInstSet/source/cpu/cHardwareManager.cc
   branches/matt/CompeteInstSet/source/cpu/cHardwareManager.h
   branches/matt/CompeteInstSet/source/main/cOrganism.cc
Log:
More modifications to use multiple instruction sets at the same time.

Modified: branches/matt/CompeteInstSet/source/cpu/cHardwareManager.cc
===================================================================
--- branches/matt/CompeteInstSet/source/cpu/cHardwareManager.cc	2009-06-05 19:02:42 UTC (rev 3291)
+++ branches/matt/CompeteInstSet/source/cpu/cHardwareManager.cc	2009-06-05 20:22:28 UTC (rev 3292)
@@ -40,49 +40,87 @@
 : m_world(world), m_type(world->GetConfig().HARDWARE_TYPE.Get()) /*, m_testres(world) */
 {
   cString filename = world->GetConfig().INST_SET.Get();
-
+  
   // Setup the instruction library and collect the default filename
   cString default_filename;
-	switch (m_type)
+  switch (m_type)
 	{
 		case HARDWARE_TYPE_CPU_ORIGINAL:
-      m_inst_sets.Push(new cInstSet(world, cHardwareCPU::GetInstLib()));
 			default_filename = cHardwareCPU::GetDefaultInstFilename();
 			break;
 		case HARDWARE_TYPE_CPU_SMT:
-      m_inst_sets.Push(new cInstSet(world, cHardwareSMT::GetInstLib()));
 			default_filename = cHardwareSMT::GetDefaultInstFilename();
 			break;
 		case HARDWARE_TYPE_CPU_TRANSSMT:
-      m_inst_sets.Push(new cInstSet(world, cHardwareTransSMT::GetInstLib()));
 			default_filename = cHardwareTransSMT::GetDefaultInstFilename();
 			break;
 		case HARDWARE_TYPE_CPU_EXPERIMENTAL:
-      m_inst_sets.Push(new cInstSet(world, cHardwareExperimental::GetInstLib()));
 			default_filename = cHardwareExperimental::GetDefaultInstFilename();
 			break;
     case HARDWARE_TYPE_CPU_GX:
-      m_inst_sets.Push(new cInstSet(world, cHardwareGX::GetInstLib()));
 			default_filename = cHardwareGX::GetDefaultInstFilename();
 			break;      
 		default:
       m_world->GetDriver().RaiseFatalException(1, "Unknown/Unsupported HARDWARE_TYPE specified");
   }
-  
   if (filename == "" || filename == "-") {
     filename = default_filename;
     m_world->GetDriver().NotifyComment(cString("Using default instruction set: ") + filename);
   }
+  AddInstSet(filename);
+}
+
+
+bool cHardwareManager::AddInstSet(const cString& filename, int id)
+{
   
+  cInstSet* new_inst_set;
+  switch (m_type)
+	{
+		case HARDWARE_TYPE_CPU_ORIGINAL:
+      new_inst_set = new cInstSet(m_world, cHardwareCPU::GetInstLib());
+			break;
+		case HARDWARE_TYPE_CPU_SMT:
+      new_inst_set = new cInstSet(m_world, cHardwareSMT::GetInstLib());
+			break;
+		case HARDWARE_TYPE_CPU_TRANSSMT:
+      new_inst_set = new cInstSet(m_world, cHardwareTransSMT::GetInstLib());
+			break;
+		case HARDWARE_TYPE_CPU_EXPERIMENTAL:
+      new_inst_set = new cInstSet(m_world, cHardwareExperimental::GetInstLib());
+			break;
+    case HARDWARE_TYPE_CPU_GX:
+      new_inst_set = new cInstSet(m_world, cHardwareGX::GetInstLib());
+			break;      
+		default:
+      m_world->GetDriver().RaiseFatalException(1, "Unknown/Unsupported HARDWARE_TYPE specified");
+  }
   
+  
   if (m_world->GetConfig().INST_SET_FORMAT.Get()) {
-    m_inst_sets.GetPos(0)->LoadFromConfig();
+    new_inst_set->LoadFromConfig();
   } else {
-    m_inst_sets.GetPos(0)->LoadFromLegacyFile(filename);
+    new_inst_set->LoadFromLegacyFile(filename);
   }
   
+  cerr << m_inst_sets.GetSize() << endl;
+  if (m_inst_sets.GetSize() == 0 || m_inst_sets[0] == new_inst_set){
+    if (id <= m_inst_sets.GetSize() - 1){ //If our array is large enough
+      if (m_inst_sets[id] != NULL) //Old instruction set exists, delete it
+        delete m_inst_sets[id];
+      m_inst_sets[id] = new_inst_set;
+    } else{  //If we have to resize the array to accomodate the ID
+      m_inst_sets.Resize(id+1, NULL);
+      m_inst_sets[id] = new_inst_set;
+    }
+  } else{ //Our instruction set is incompatible
+    m_world->GetDriver().RaiseFatalException(1, "Additional instruction set addition is incompatible.");
+  }
+  
+  return true;
 }
 
+
 cHardwareBase* cHardwareManager::Create(cOrganism* in_org)
 {
   assert(in_org != NULL);
@@ -91,15 +129,15 @@
   switch (m_type)
   {
     case HARDWARE_TYPE_CPU_ORIGINAL:
-      return new cHardwareCPU(m_world, in_org, m_inst_sets.GetPos(inst_id));
+      return new cHardwareCPU(m_world, in_org, m_inst_sets[inst_id]);
     case HARDWARE_TYPE_CPU_SMT:
-      return new cHardwareSMT(m_world, in_org, m_inst_sets.GetPos(inst_id));
+      return new cHardwareSMT(m_world, in_org, m_inst_sets[inst_id]);
     case HARDWARE_TYPE_CPU_TRANSSMT:
-      return new cHardwareTransSMT(m_world, in_org, m_inst_sets.GetPos(inst_id));
+      return new cHardwareTransSMT(m_world, in_org, m_inst_sets[inst_id]);
     case HARDWARE_TYPE_CPU_EXPERIMENTAL:
-      return new cHardwareExperimental(m_world, in_org, m_inst_sets.GetPos(inst_id));
+      return new cHardwareExperimental(m_world, in_org, m_inst_sets[inst_id]);
     case HARDWARE_TYPE_CPU_GX:
-      return new cHardwareGX(m_world, in_org, m_inst_sets.GetPos(inst_id));
+      return new cHardwareGX(m_world, in_org, m_inst_sets[inst_id]);
     default:
       return NULL;
   }

Modified: branches/matt/CompeteInstSet/source/cpu/cHardwareManager.h
===================================================================
--- branches/matt/CompeteInstSet/source/cpu/cHardwareManager.h	2009-06-05 19:02:42 UTC (rev 3291)
+++ branches/matt/CompeteInstSet/source/cpu/cHardwareManager.h	2009-06-05 20:22:28 UTC (rev 3292)
@@ -25,6 +25,8 @@
 #ifndef cHardwareManager_h
 #define cHardwareManager_h
 
+#include <cassert>
+
 #ifndef cTestCPU_h
 #include "cTestCPU.h"
 #endif
@@ -39,8 +41,11 @@
 #include "tList.h"
 #endif
 
+#ifndef cInstSet_h
+#include "cInstSet.h"
+#endif
+
 class cHardwareBase;
-class cInstSet;
 class cOrganism;
 class cWorld;
 
@@ -52,7 +57,7 @@
 #endif
 private:
   cWorld* m_world;
-  tList<cInstSet> m_inst_sets;
+  tArray<cInstSet*> m_inst_sets;
   int m_type;
 //  cTestResources m_testres;
   
@@ -63,13 +68,15 @@
 
 public:
   cHardwareManager(cWorld* world);
-  ~cHardwareManager() { ; }
+  ~cHardwareManager() { for(int i = 0; i < m_inst_sets.GetSize(); i++) delete m_inst_sets[i]; }
   
   cHardwareBase* Create(cOrganism* in_org);
   cTestCPU* CreateTestCPU() { return new cTestCPU(m_world /*, &m_testres*/); }
 
-  const cInstSet& GetInstSet(int id=0) const { return *m_inst_sets.GetPos(id); }
-  cInstSet& GetInstSet(int id=0) { return *m_inst_sets.GetPos(id); }
+  const cInstSet& GetInstSet(int id=0) const { assert(id < m_inst_sets.GetSize()); return *(m_inst_sets[id]); }
+  cInstSet& GetInstSet(int id=0) { assert(id < m_inst_sets.GetSize()); return *(m_inst_sets[id]); }
+  
+  bool AddInstSet(const cString& filename, int id = 0);
 };
 
 

Modified: branches/matt/CompeteInstSet/source/main/cOrganism.cc
===================================================================
--- branches/matt/CompeteInstSet/source/main/cOrganism.cc	2009-06-05 19:02:42 UTC (rev 3291)
+++ branches/matt/CompeteInstSet/source/main/cOrganism.cc	2009-06-05 20:22:28 UTC (rev 3292)
@@ -59,7 +59,7 @@
   , m_interface(NULL)
   , m_lineage_label(-1)
   , m_lineage(NULL)
-  , m_inst_set_id(m_inst_set_id)
+  , m_inst_set_id(inst_set_id)
   , m_input_pointer(0)
   , m_input_buf(world->GetEnvironment().GetInputSize())
   , m_output_buf(world->GetEnvironment().GetOutputSize())




More information about the Avida-cvs mailing list