inline void InitData(void){
                if (name_fmap != "NULL") fmap.LoadText(name_fmap.c_str());
                if (task == "dump") return;
                if (task == "pred" || task == "dumppath"){
                    data.CacheLoad(test_path.c_str(), silent != 0, use_buffer != 0);
                }
                else{
                    // training 
                    data.CacheLoad(train_path.c_str(), silent != 0, use_buffer != 0);
                    utils::Assert(eval_data_names.size() == eval_data_paths.size());
                    for (size_t i = 0; i < eval_data_names.size(); ++i){
                        deval.push_back(new DMatrix());
                        deval.back()->CacheLoad(eval_data_paths[i].c_str(), silent != 0, use_buffer != 0);
                        devalall.push_back(deval.back());
                    }
                    std::vector<const DMatrix *> dcache(1, &data);
                    for( size_t i = 0; i < deval.size(); ++ i){
                        dcache.push_back( deval[i] );
                    }
                    // set cache data to be all training and evaluation data
                    learner.SetCacheData(dcache);

                    // add training set to evaluation set if needed
                    if( eval_train != 0 ){
                        devalall.push_back( &data );
                        eval_data_names.push_back( std::string("train") );
                    }

                }
            }
  inline void InitData(void) {
    // 返回指向第一次出现字符character位置的指针,如果没找到则返回NULL, 
    // 如果找到返回的一个char × 类型
    if (strchr(train_path.c_str(), '%') != NULL) {
      char s_tmp[256];
      utils::SPrintf(s_tmp, sizeof(s_tmp), train_path.c_str(), rabit::GetRank());
      train_path = s_tmp;
      load_part = 1;
    }
    bool loadsplit = data_split == "row";
    if (name_fmap != "NULL") fmap.LoadText(name_fmap.c_str());
    if (task == "dump") return;
    if (task == "pred") {
      data = io::LoadDataMatrix(test_path.c_str(), silent != 0, use_buffer != 0, loadsplit);
    } else {
      // training
      /* 换回的是一个 DMatrixSimple类型的数据, 他有3个元素, 
       * 其中row_ptr_: 是CRS的索引数据 
       * row_data_:是稀疏元素的值, 他的每个元素包含两个值,一个是列的索引,
       * 另一个是元素的值
       * 第3个元素还没有看出他的意思 */
      data = io::LoadDataMatrix(train_path.c_str(),
                                silent != 0 && load_part == 0,
                                use_buffer != 0, loadsplit);
      utils::Assert(eval_data_names.size() == eval_data_paths.size(), "BUG");
      // 将训练过程中的验证数据也一并载入进去
      for (size_t i = 0; i < eval_data_names.size(); ++i) {
        deval.push_back(io::LoadDataMatrix(eval_data_paths[i].c_str(),
                                           silent != 0,
                                           use_buffer != 0,
                                           loadsplit));
        devalall.push_back(deval.back());
      }

      // dcache的第一个数据是训练数据,其他是训练过程中的验证数据
      std::vector<io::DataMatrix *> dcache(1, data);
      for (size_t i = 0; i < deval.size(); ++ i) {
        dcache.push_back(deval[i]);
      }
      // set cache data to be all training and evaluation data
      learner.SetCacheData(dcache);
      
      // add training set to evaluation set if needed
      if (eval_train != 0) {
        devalall.push_back(data);
        eval_data_names.push_back(std::string("train"));
      }
    }
  }
  inline void InitData(void) {
    if (strchr(train_path.c_str(), '%') != NULL) {
      char s_tmp[256];
      utils::SPrintf(s_tmp, sizeof(s_tmp), train_path.c_str(), rabit::GetRank());
      train_path = s_tmp;
      load_part = 1;
    }
    bool loadsplit = data_split == "row";
    if (name_fmap != "NULL") fmap.LoadText(name_fmap.c_str());
    if (task == "dump") return;
    if (task == "pred") {
      data = io::LoadDataMatrix(test_path.c_str(), silent != 0, use_buffer != 0, loadsplit);
    } else {
      // training
      data = io::LoadDataMatrix(train_path.c_str(),
                                silent != 0 && load_part == 0,
                                use_buffer != 0, loadsplit);
      utils::Assert(eval_data_names.size() == eval_data_paths.size(), "BUG");
      for (size_t i = 0; i < eval_data_names.size(); ++i) {
        deval.push_back(io::LoadDataMatrix(eval_data_paths[i].c_str(),
                                           silent != 0,
                                           use_buffer != 0,
                                           loadsplit));
        devalall.push_back(deval.back());
      }

      std::vector<io::DataMatrix *> dcache(1, data);
      for (size_t i = 0; i < deval.size(); ++i) {
        dcache.push_back(deval[i]);
      }
      // set cache data to be all training and evaluation data
      learner.SetCacheData(dcache);

      // add training set to evaluation set if needed
      if (eval_train != 0) {
        devalall.push_back(data);
        eval_data_names.push_back(std::string("train"));
      }
    }
  }
int main(int argc, char** argv) {
  DataStoreNodeTemplate tlb_stat("tlb_stat"); {
    tlb_stat.summable = 1;
    tlb_stat.addint("hits");
    tlb_stat.addint("misses");
  }
  DataStoreNodeTemplate PerContextOutOfOrderCoreStats("PerContextOutOfOrderCoreStats"); {
    DataStoreNodeTemplate& fetch = PerContextOutOfOrderCoreStats("fetch"); {
      DataStoreNodeTemplate& stop = fetch("stop"); {
        stop.summable = 1;
        stop.addint("stalled");
        stop.addint("icache_miss");
        stop.addint("fetchq_full");
        stop.addint("issueq_quota_full");
        stop.addint("bogus_rip");
        stop.addint("microcode_assist");
        stop.addint("branch_taken");
        stop.addint("full_width");
        stop.addint("icache_stalled");
        stop.addint("invalid_blocks");
      }
      fetch.histogram("opclass", 29, opclass_names);
      fetch.histogram("width", OutOfOrderModel::FETCH_WIDTH+1, 0, OutOfOrderModel::FETCH_WIDTH, 1);
      fetch.addint("blocks");
      fetch.addint("uops");
      fetch.addint("user_insns");
    }
    DataStoreNodeTemplate& frontend = PerContextOutOfOrderCoreStats("frontend"); {
      DataStoreNodeTemplate& status = frontend("status"); {
        status.summable = 1;
        status.addint("complete");
        status.addint("fetchq_empty");
        status.addint("rob_full");
        status.addint("physregs_full");
        status.addint("ldq_full");
        status.addint("stq_full");
      }
      frontend.histogram("width", OutOfOrderModel::FRONTEND_WIDTH+1, 0, OutOfOrderModel::FRONTEND_WIDTH, 1);
      DataStoreNodeTemplate& renamed = frontend("renamed"); {
        renamed.addint("none");
        renamed.addint("reg");
        renamed.addint("flags");
        renamed.addint("reg_and_flags");
      }
      DataStoreNodeTemplate& alloc = frontend("alloc"); {
        alloc.addint("reg");
        alloc.addint("ldreg");
        alloc.addint("sfr");
        alloc.addint("br");
      }
      frontend.histogram("consumer_count", 256, 0, 255, 1);
    }
    DataStoreNodeTemplate& dispatch = PerContextOutOfOrderCoreStats("dispatch"); {
      dispatch.histogram("cluster", OutOfOrderModel::MAX_CLUSTERS, OutOfOrderModel::cluster_names);
      DataStoreNodeTemplate& redispatch = dispatch("redispatch"); {
        redispatch.addint("trigger_uops");
        redispatch.addint("deadlock_flushes");
        redispatch.addint("deadlock_uops_flushed");
        redispatch.histogram("dependent_uops", OutOfOrderModel::ROB_SIZE+1, 0, OutOfOrderModel::ROB_SIZE, 1);
      }
    }
    DataStoreNodeTemplate& issue = PerContextOutOfOrderCoreStats("issue"); {
      issue.addint("uops");
      issue.addfloat("uipc");
      DataStoreNodeTemplate& result = issue("result"); {
        result.summable = 1;
        result.addint("no_fu");
        result.addint("replay");
        result.addint("misspeculated");
        result.addint("refetch");
        result.addint("branch_mispredict");
        result.addint("exception");
        result.addint("complete");
      }
      issue.histogram("opclass", 29, opclass_names);
    }
    DataStoreNodeTemplate& writeback = PerContextOutOfOrderCoreStats("writeback"); {
      writeback.histogram("writebacks", OutOfOrderModel::PHYS_REG_FILE_COUNT, OutOfOrderModel::phys_reg_file_names);
    }
    DataStoreNodeTemplate& commit = PerContextOutOfOrderCoreStats("commit"); {
      commit.addint("uops");
      commit.addint("insns");
      commit.addfloat("uipc");
      commit.addfloat("ipc");
      DataStoreNodeTemplate& result = commit("result"); {
        result.summable = 1;
        result.addint("none");
        result.addint("ok");
        result.addint("exception");
        result.addint("skipblock");
        result.addint("barrier");
        result.addint("smc");
        result.addint("memlocked");
        result.addint("stop");
        result.addint("dcache_stall");
      }
      DataStoreNodeTemplate& fail = commit("fail"); {
        fail.summable = 1;
        fail.addint("free_list");
        fail.addint("frontend_list");
        fail.addint("ready_to_dispatch_list");
        fail.addint("dispatched_list");
        fail.addint("ready_to_issue_list");
        fail.addint("ready_to_store_list");
        fail.addint("ready_to_load_list");
        fail.addint("issued_list");
        fail.addint("completed_list");
        fail.addint("ready_to_writeback_list");
        fail.addint("cache_miss_list");
        fail.addint("tlb_miss_list");
        fail.addint("memory_fence_list");
        fail.addint("ready_to_commit_queue");
      }
      DataStoreNodeTemplate& setflags = commit("setflags"); {
        setflags.summable = 1;
        setflags.addint("yes");
        setflags.addint("no");
      }
      commit.histogram("opclass", 29, opclass_names);
    }
    DataStoreNodeTemplate& branchpred = PerContextOutOfOrderCoreStats("branchpred"); {
      branchpred.addint("predictions");
      branchpred.addint("updates");
      branchpred.histogram("cond", 2, branchpred_outcome_names);
      branchpred.histogram("indir", 2, branchpred_outcome_names);
      branchpred.histogram("ret", 2, branchpred_outcome_names);
      branchpred.histogram("summary", 2, branchpred_outcome_names);
      DataStoreNodeTemplate& ras = branchpred("ras"); {
        ras.summable = 1;
        ras.addint("pushes");
        ras.addint("overflows");
        ras.addint("pops");
        ras.addint("underflows");
        ras.addint("annuls");
      }
    }
    DataStoreNodeTemplate& dcache = PerContextOutOfOrderCoreStats("dcache"); {
      DataStoreNodeTemplate& load = dcache("load"); {
        DataStoreNodeTemplate& issue = load("issue"); {
          issue.summable = 1;
          issue.addint("complete");
          issue.addint("miss");
          issue.addint("exception");
          issue.addint("ordering");
          issue.addint("unaligned");
          DataStoreNodeTemplate& replay = issue("replay"); {
            replay.summable = 1;
            replay.addint("sfr_addr_and_data_not_ready");
            replay.addint("sfr_addr_not_ready");
            replay.addint("sfr_data_not_ready");
            replay.addint("missbuf_full");
            replay.addint("interlocked");
            replay.addint("interlock_overflow");
            replay.addint("fence");
            replay.addint("bank_conflict");
            replay.addint("dcache_stall");
          }
        }
        DataStoreNodeTemplate& forward = load("forward"); {
          forward.summable = 1;
          forward.addint("cache");
          forward.addint("sfr");
          forward.addint("sfr_and_cache");
        }
        DataStoreNodeTemplate& dependency = load("dependency"); {
          dependency.summable = 1;
          dependency.addint("independent");
          dependency.addint("predicted_alias_unresolved");
          dependency.addint("stq_address_match");
          dependency.addint("stq_address_not_ready");
          dependency.addint("fence");
          dependency.addint("mmio");
        }
        DataStoreNodeTemplate& type = load("type"); {
          type.summable = 1;
          type.addint("aligned");
          type.addint("unaligned");
          type.addint("internal");
        }
        load.histogram("size", 4, sizeshift_names);
        load.histogram("datatype", DATATYPE_COUNT, datatype_names);
      }
      DataStoreNodeTemplate& store = dcache("store"); {
        DataStoreNodeTemplate& issue = store("issue"); {
          issue.summable = 1;
          issue.addint("complete");
          issue.addint("exception");
          issue.addint("ordering");
          issue.addint("unaligned");
          DataStoreNodeTemplate& replay = issue("replay"); {
            replay.summable = 1;
            replay.addint("sfr_addr_and_data_not_ready");
            replay.addint("sfr_addr_not_ready");
            replay.addint("sfr_data_not_ready");
            replay.addint("sfr_addr_and_data_and_data_to_store_not_ready");
            replay.addint("sfr_addr_and_data_to_store_not_ready");
            replay.addint("sfr_data_and_data_to_store_not_ready");
            replay.addint("interlocked");
            replay.addint("fence");
            replay.addint("parallel_aliasing");
            replay.addint("bank_conflict");
          }
        }
        DataStoreNodeTemplate& forward = store("forward"); {
          forward.summable = 1;
          forward.addint("zero");
          forward.addint("sfr");
        }
        DataStoreNodeTemplate& type = store("type"); {
          type.summable = 1;
          type.addint("aligned");
          type.addint("unaligned");
          type.addint("internal");
        }
        store.histogram("size", 4, sizeshift_names);
        store.histogram("datatype", DATATYPE_COUNT, datatype_names);
      }
      DataStoreNodeTemplate& fence = dcache("fence"); {
        fence.summable = 1;
        fence.addint("lfence");
        fence.addint("sfence");
        fence.addint("mfence");
      }
      dcache.add("dtlb", tlb_stat);
      dcache.add("itlb", tlb_stat);
      dcache.histogram("dtlb_latency", 1001, 0, 200, 1);
      dcache.histogram("itlb_latency", 1001, 0, 200, 1);
    }
    PerContextOutOfOrderCoreStats.addint("interrupt_requests");
    PerContextOutOfOrderCoreStats.addint("cpu_exit_requests");
    PerContextOutOfOrderCoreStats.addint("cycles_in_pause");
  }
  DataStoreNodeTemplate OutOfOrderCoreStats("OutOfOrderCoreStats"); {
    OutOfOrderCoreStats.addint("cycles");
    DataStoreNodeTemplate& dispatch = OutOfOrderCoreStats("dispatch"); {
      DataStoreNodeTemplate& source = dispatch("source"); {
        source.summable = 1;
        source.histogram("integer", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
        source.histogram("fp", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
        source.histogram("st", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
        source.histogram("br", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
      }
      dispatch.histogram("width", OutOfOrderModel::DISPATCH_WIDTH+1, 0, OutOfOrderModel::DISPATCH_WIDTH, 1);
    }
    DataStoreNodeTemplate& issue = OutOfOrderCoreStats("issue"); {
      DataStoreNodeTemplate& source = issue("source"); {
        source.summable = 1;
        source.histogram("integer", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
        source.histogram("fp", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
        source.histogram("st", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
        source.histogram("br", OutOfOrderModel::MAX_PHYSREG_STATE, OutOfOrderModel::physreg_state_names);
      }
      DataStoreNodeTemplate& width = issue("width"); {
        width.histogram("all", OutOfOrderModel::MAX_ISSUE_WIDTH+1, 0, OutOfOrderModel::MAX_ISSUE_WIDTH, 1);
      }
    }
    DataStoreNodeTemplate& writeback = OutOfOrderCoreStats("writeback"); {
      DataStoreNodeTemplate& width = writeback("width"); {
        width.histogram("all", OutOfOrderModel::MAX_ISSUE_WIDTH+1, 0, OutOfOrderModel::MAX_ISSUE_WIDTH, 1);
      }
    }
    DataStoreNodeTemplate& commit = OutOfOrderCoreStats("commit"); {
      DataStoreNodeTemplate& freereg = commit("freereg"); {
        freereg.summable = 1;
        freereg.addint("pending");
        freereg.addint("free");
      }
      commit.addint("free_regs_recycled");
      commit.histogram("width", OutOfOrderModel::COMMIT_WIDTH+1, 0, OutOfOrderModel::COMMIT_WIDTH, 1);
    }
    DataStoreNodeTemplate& branchpred = OutOfOrderCoreStats("branchpred"); {
      branchpred.addint("predictions");
      branchpred.addint("updates");
      branchpred.histogram("cond", 2, branchpred_outcome_names);
      branchpred.histogram("indir", 2, branchpred_outcome_names);
      branchpred.histogram("ret", 2, branchpred_outcome_names);
      branchpred.histogram("summary", 2, branchpred_outcome_names);
      DataStoreNodeTemplate& ras = branchpred("ras"); {
        ras.summable = 1;
        ras.addint("pushes");
        ras.addint("overflows");
        ras.addint("pops");
        ras.addint("underflows");
        ras.addint("annuls");
      }
    }
    OutOfOrderCoreStats.add("total", PerContextOutOfOrderCoreStats);
    OutOfOrderCoreStats.add("vcpu0", PerContextOutOfOrderCoreStats);
    OutOfOrderCoreStats.add("vcpu1", PerContextOutOfOrderCoreStats);
    OutOfOrderCoreStats.add("vcpu2", PerContextOutOfOrderCoreStats);
    OutOfOrderCoreStats.add("vcpu3", PerContextOutOfOrderCoreStats);
    DataStoreNodeTemplate& simulator = OutOfOrderCoreStats("simulator"); {
      simulator.addfloat("total_time");
      DataStoreNodeTemplate& cputime = simulator("cputime"); {
        cputime.summable = 1;
        cputime.addfloat("fetch");
        cputime.addfloat("decode");
        cputime.addfloat("rename");
        cputime.addfloat("frontend");
        cputime.addfloat("dispatch");
        cputime.addfloat("issue");
        cputime.addfloat("issueload");
        cputime.addfloat("issuestore");
        cputime.addfloat("complete");
        cputime.addfloat("transfer");
        cputime.addfloat("writeback");
        cputime.addfloat("commit");
      }
    }
  }
  DataStoreNodeTemplate PerContextDataCacheStats("PerContextDataCacheStats"); {
    DataStoreNodeTemplate& load = PerContextDataCacheStats("load"); {
      DataStoreNodeTemplate& hit = load("hit"); {
        hit.summable = 1;
        hit.addint("L1");
        hit.addint("L2");
        hit.addint("L3");
        hit.addint("mem");
      }
      DataStoreNodeTemplate& dtlb = load("dtlb"); {
        dtlb.summable = 1;
        dtlb.addint("hits");
        dtlb.addint("misses");
      }
      DataStoreNodeTemplate& tlbwalk = load("tlbwalk"); {
        tlbwalk.summable = 1;
        tlbwalk.addint("L1_dcache_hit");
        tlbwalk.addint("L1_dcache_miss");
        tlbwalk.addint("no_lfrq_mb");
      }
    }
    DataStoreNodeTemplate& fetch = PerContextDataCacheStats("fetch"); {
      DataStoreNodeTemplate& hit = fetch("hit"); {
        hit.summable = 1;
        hit.addint("L1");
        hit.addint("L2");
        hit.addint("L3");
        hit.addint("mem");
      }
      DataStoreNodeTemplate& itlb = fetch("itlb"); {
        itlb.summable = 1;
        itlb.addint("hits");
        itlb.addint("misses");
      }
      DataStoreNodeTemplate& tlbwalk = fetch("tlbwalk"); {
        tlbwalk.summable = 1;
        tlbwalk.addint("L1_dcache_hit");
        tlbwalk.addint("L1_dcache_miss");
        tlbwalk.addint("no_lfrq_mb");
      }
    }
    DataStoreNodeTemplate& store = PerContextDataCacheStats("store"); {
      store.addint("prefetches");
    }
  }
  DataStoreNodeTemplate DataCacheStats("DataCacheStats"); {
    DataStoreNodeTemplate& load = DataCacheStats("load"); {
      DataStoreNodeTemplate& transfer = load("transfer"); {
        transfer.summable = 1;
        transfer.addint("L2_to_L1_full");
        transfer.addint("L2_to_L1_partial");
        transfer.addint("L2_L1I_full");
      }
    }
    DataStoreNodeTemplate& missbuf = DataCacheStats("missbuf"); {
      missbuf.addint("inserts");
      DataStoreNodeTemplate& deliver = missbuf("deliver"); {
        deliver.summable = 1;
        deliver.addint("mem_to_L3");
        deliver.addint("L3_to_L2");
        deliver.addint("L2_to_L1D");
        deliver.addint("L2_to_L1I");
      }
    }
    DataStoreNodeTemplate& prefetch = DataCacheStats("prefetch"); {
      prefetch.summable = 1;
      prefetch.addint("in_L1");
      prefetch.addint("in_L2");
      prefetch.addint("required");
    }
    DataStoreNodeTemplate& lfrq = DataCacheStats("lfrq"); {
      lfrq.addint("inserts");
      lfrq.addint("wakeups");
      lfrq.addint("annuls");
      lfrq.addint("resets");
      lfrq.addint("total_latency");
      lfrq.addfloat("average_latency");
      lfrq.histogram("width", CacheSubsystem::MAX_WAKEUPS_PER_CYCLE+1, 0, CacheSubsystem::MAX_WAKEUPS_PER_CYCLE+1, 1);
    }
    DataCacheStats.add("total", PerContextDataCacheStats);
    DataCacheStats.add("vcpu0", PerContextDataCacheStats);
    DataCacheStats.add("vcpu1", PerContextDataCacheStats);
    DataCacheStats.add("vcpu2", PerContextDataCacheStats);
    DataCacheStats.add("vcpu3", PerContextDataCacheStats);
  }
  DataStoreNodeTemplate stall_sub("stall_sub"); {
    stall_sub.summable = 1;
    stall_sub.addint("dependency");
    stall_sub.addint("cache_port");
    stall_sub.addint("buffer_full");
  }
  DataStoreNodeTemplate CacheStats("CacheStats"); {
    DataStoreNodeTemplate& cpurequest = CacheStats("cpurequest"); {
      DataStoreNodeTemplate& count = cpurequest("count"); {
        count.summable = 1;
        DataStoreNodeTemplate& hit = count("hit"); {
          DataStoreNodeTemplate& read = hit("read"); {
            read.summable = 1;
            DataStoreNodeTemplate& hit = read("hit"); {
              hit.summable = 1;
              hit.addint("hit");
              hit.addint("forward");
            }
          }
          DataStoreNodeTemplate& write = hit("write"); {
            write.summable = 1;
            DataStoreNodeTemplate& hit = write("hit"); {
              hit.summable = 1;
              hit.addint("hit");
              hit.addint("forward");
            }
          }
        }
        DataStoreNodeTemplate& miss = count("miss"); {
          miss.summable = 1;
          miss.addint("read");
          miss.addint("write");
        }
      }
      DataStoreNodeTemplate& stall = cpurequest("stall"); {
        stall.summable = 1;
        stall.add("read", stall_sub);
        stall.add("write", stall_sub);
      }
      cpurequest.addint("redirects");
    }
    DataStoreNodeTemplate& snooprequest = CacheStats("snooprequest"); {
      snooprequest.summable = 1;
      snooprequest.addint("hit");
      snooprequest.addint("miss");
    }
    CacheStats.addint("annul");
    CacheStats.addint("queueFull");
    DataStoreNodeTemplate& latency = CacheStats("latency"); {
      latency.summable = 1;
      latency.addint("IF");
      latency.addint("load");
      latency.addint("store");
    }
    DataStoreNodeTemplate& lat_count = CacheStats("lat_count"); {
      lat_count.summable = 1;
      lat_count.addint("IF");
      lat_count.addint("load");
      lat_count.addint("store");
    }
    DataStoreNodeTemplate& mesi_stats = CacheStats("mesi_stats"); {
      DataStoreNodeTemplate& hit_state = mesi_stats("hit_state"); {
        hit_state.summable = 1;
        hit_state.histogram("snoop", 5, 0, 4, 1);
        hit_state.histogram("cpu", 5, 0, 4, 1);
      }
      mesi_stats.histogram("state_transition", 17, 0, 16, 1);
    }
  }
  DataStoreNodeTemplate PerCoreCacheStats("PerCoreCacheStats"); {
    PerCoreCacheStats.add("CPUController", CacheStats);
    PerCoreCacheStats.add("L1I", CacheStats);
    PerCoreCacheStats.add("L1D", CacheStats);
    PerCoreCacheStats.add("L2", CacheStats);
    PerCoreCacheStats.add("L3", CacheStats);
  }
  DataStoreNodeTemplate BusStats("BusStats"); {
    DataStoreNodeTemplate& broadcasts = BusStats("broadcasts"); {
      broadcasts.summable = 1;
      broadcasts.addint("read");
      broadcasts.addint("write");
      broadcasts.addint("update");
    }
    DataStoreNodeTemplate& broadcast_cycles = BusStats("broadcast_cycles"); {
      broadcast_cycles.summable = 1;
      broadcast_cycles.addint("read");
      broadcast_cycles.addint("write");
      broadcast_cycles.addint("update");
    }
    BusStats.addint("addr_bus_cycles");
    BusStats.addint("data_bus_cycles");
  }
  DataStoreNodeTemplate EventsInMode("EventsInMode"); {
    EventsInMode.summable = 1;
    EventsInMode.addint("user64");
    EventsInMode.addint("user32");
    EventsInMode.addint("kernel64");
    EventsInMode.addint("kernel32");
    EventsInMode.addint("legacy16");
    EventsInMode.addint("userlib");
    EventsInMode.addint("microcode");
    EventsInMode.addint("idle");
  }
  DataStoreNodeTemplate PerCoreEvents("PerCoreEvents"); {
    PerCoreEvents.add("cycles_in_mode", EventsInMode);
    PerCoreEvents.add("insns_in_mode", EventsInMode);
    PerCoreEvents.add("uops_in_mode", EventsInMode);
  }
  DataStoreNodeTemplate PTLsimStats("PTLsimStats"); {
    PTLsimStats.addint("snapshot_uuid");
    PTLsimStats.addstring("snapshot_name", 64);
    DataStoreNodeTemplate& summary = PTLsimStats("summary"); {
      summary.addint("cycles");
      summary.addint("insns");
      summary.addint("uops");
      summary.addint("basicblocks");
    }
    DataStoreNodeTemplate& simulator = PTLsimStats("simulator"); {
      DataStoreNodeTemplate& version = simulator("version"); {
        version.addstring("build_timestamp", 32);
        version.addint("svn_revision");
        version.addstring("svn_timestamp", 32);
        version.addstring("build_hostname", 64);
        version.addstring("build_compiler", 16);
      }
      DataStoreNodeTemplate& run = simulator("run"); {
        run.addint("timestamp");
        run.addstring("hostname", 64);
        run.addstring("kernel_version", 32);
        run.addstring("hypervisor_version", 32);
        run.addint("native_cpuid");
        run.addint("native_hz");
      }
      DataStoreNodeTemplate& config = simulator("config"); {
        config.addstring("config", 256);
      }
      DataStoreNodeTemplate& performance = simulator("performance"); {
        DataStoreNodeTemplate& rate = performance("rate"); {
          rate.addfloat("cycles_per_sec");
          rate.addfloat("issues_per_sec");
          rate.addfloat("user_commits_per_sec");
        }
      }
    }
    DataStoreNodeTemplate& decoder = PTLsimStats("decoder"); {
      DataStoreNodeTemplate& throughput = decoder("throughput"); {
        throughput.addint("basic_blocks");
        throughput.addint("x86_insns");
        throughput.addint("uops");
        throughput.addint("bytes");
      }
      decoder.histogram("x86_decode_type", DECODE_TYPE_COUNT, decode_type_names);
      DataStoreNodeTemplate& bb_decode_type = decoder("bb_decode_type"); {
        bb_decode_type.summable = 1;
        bb_decode_type.addint("all_insns_fast");
        bb_decode_type.addint("some_complex_insns");
      }
      DataStoreNodeTemplate& page_crossings = decoder("page_crossings"); {
        page_crossings.summable = 1;
        page_crossings.addint("within_page");
        page_crossings.addint("crosses_page");
      }
      DataStoreNodeTemplate& bbcache = decoder("bbcache"); {
        bbcache.addint("count");
        bbcache.addint("inserts");
        bbcache.histogram("invalidates", INVALIDATE_REASON_COUNT, invalidate_reason_names);
      }
      DataStoreNodeTemplate& pagecache = decoder("pagecache"); {
        pagecache.addint("count");
        pagecache.addint("inserts");
        pagecache.histogram("invalidates", INVALIDATE_REASON_COUNT, invalidate_reason_names);
      }
      decoder.addint("reclaim_rounds");
    }
    PTLsimStats.add("ooocore_total", OutOfOrderCoreStats);
    PTLsimStats.add("ooocore_context_total", PerContextOutOfOrderCoreStats);
    PTLsimStats.addint("elapse_seconds");
    DataStoreNodeTemplate& ooocore = PTLsimStats("ooocore"); {
      ooocore.add("total", OutOfOrderCoreStats);
      ooocore.add("c0", OutOfOrderCoreStats);
      ooocore.add("c1", OutOfOrderCoreStats);
      ooocore.add("c2", OutOfOrderCoreStats);
      ooocore.add("c3", OutOfOrderCoreStats);
      ooocore.add("c4", OutOfOrderCoreStats);
      ooocore.add("c5", OutOfOrderCoreStats);
      ooocore.add("c6", OutOfOrderCoreStats);
      ooocore.add("c7", OutOfOrderCoreStats);
    }
    DataStoreNodeTemplate& dcache = PTLsimStats("dcache"); {
      dcache.add("total", DataCacheStats);
      dcache.add("c0", DataCacheStats);
      dcache.add("c1", DataCacheStats);
      dcache.add("c2", DataCacheStats);
      dcache.add("c3", DataCacheStats);
      dcache.add("c4", DataCacheStats);
      dcache.add("c5", DataCacheStats);
      dcache.add("c6", DataCacheStats);
      dcache.add("c7", DataCacheStats);
    }
    DataStoreNodeTemplate& external = PTLsimStats("external"); {
      external.histogram("assists", ASSIST_COUNT, assist_names);
      external.histogram("l_assists", L_ASSIST_COUNT, light_assist_names);
      external.histogram("traps", 256, x86_exception_names);
      external.add("total", PerCoreEvents);
      external.add("c0", PerCoreEvents);
      external.add("c1", PerCoreEvents);
      external.add("c2", PerCoreEvents);
      external.add("c3", PerCoreEvents);
      external.add("c4", PerCoreEvents);
      external.add("c5", PerCoreEvents);
      external.add("c6", PerCoreEvents);
      external.add("c7", PerCoreEvents);
    }
    DataStoreNodeTemplate& memory = PTLsimStats("memory"); {
      memory.add("total", PerCoreCacheStats);
      memory.add("c0", PerCoreCacheStats);
      memory.add("c1", PerCoreCacheStats);
      memory.add("c2", PerCoreCacheStats);
      memory.add("c3", PerCoreCacheStats);
      memory.add("c4", PerCoreCacheStats);
      memory.add("c5", PerCoreCacheStats);
      memory.add("c6", PerCoreCacheStats);
      memory.add("c7", PerCoreCacheStats);
      memory.add("bus", BusStats);
      memory.histogram("dcache_latency", 200, 0, 199, 1);
      memory.histogram("icache_latency", 200, 0, 199, 1);
    }
  }
  ofstream os(argv[1], std::ios::binary |std::ios::out);
  PTLsimStats.write(os);
  os.close();
}