+ #
+ # determine size and index bits for probe filter
+ # By default, the probe filter size is configured to be twice the
+ # size of the L2 cache.
+ #
+ pf_size = MemorySize(options.l2_size)
+ pf_size.value = pf_size.value * 2
+ dir_bits = int(math.log(options.num_dirs, 2))
+ pf_bits = int(math.log(pf_size.value, 2))
+ if options.numa_high_bit:
+ if options.pf_on or options.dir_on:
+ # if numa high bit explicitly set, make sure it does not overlap
+ # with the probe filter index
+ assert(options.numa_high_bit - dir_bits > pf_bits)
+
+ # set the probe filter start bit to just above the block offset
+ pf_start_bit = block_size_bits
+ else:
+ if dir_bits > 0:
+ pf_start_bit = dir_bits + block_size_bits - 1
+ else:
+ pf_start_bit = block_size_bits
+
+ # Run each of the ruby memory controllers at a ratio of the frequency of
+ # the ruby system
+ # clk_divider value is a fix to pass regression.
+ ruby_system.memctrl_clk_domain = DerivedClockDomain(
+ clk_domain=ruby_system.clk_domain,
+ clk_divider=3)
+
+ mem_dir_cntrl_nodes, rom_dir_cntrl_node = create_directories(
+ options, bootmem, ruby_system, system)
+ dir_cntrl_nodes = mem_dir_cntrl_nodes[:]
+ if rom_dir_cntrl_node is not None:
+ dir_cntrl_nodes.append(rom_dir_cntrl_node)
+ for dir_cntrl in dir_cntrl_nodes:
+ pf = ProbeFilter(size = pf_size, assoc = 4,
+ start_index_bit = pf_start_bit)
+
+ dir_cntrl.probeFilter = pf
+ dir_cntrl.probe_filter_enabled = options.pf_on
+ dir_cntrl.full_bit_dir_enabled = options.dir_on
+
+ if options.recycle_latency:
+ dir_cntrl.recycle_latency = options.recycle_latency
+
+ # Connect the directory controller to the network
+ dir_cntrl.forwardFromDir = MessageBuffer()
+ dir_cntrl.forwardFromDir.master = ruby_system.network.slave
+ dir_cntrl.responseFromDir = MessageBuffer()
+ dir_cntrl.responseFromDir.master = ruby_system.network.slave
+ dir_cntrl.dmaResponseFromDir = MessageBuffer(ordered = True)
+ dir_cntrl.dmaResponseFromDir.master = ruby_system.network.slave
+
+ dir_cntrl.triggerQueue = MessageBuffer(ordered = True)
+
+ dir_cntrl.unblockToDir = MessageBuffer()
+ dir_cntrl.unblockToDir.slave = ruby_system.network.master
+ dir_cntrl.responseToDir = MessageBuffer()
+ dir_cntrl.responseToDir.slave = ruby_system.network.master
+ dir_cntrl.requestToDir = MessageBuffer()
+ dir_cntrl.requestToDir.slave = ruby_system.network.master
+ dir_cntrl.dmaRequestToDir = MessageBuffer(ordered = True)
+ dir_cntrl.dmaRequestToDir.slave = ruby_system.network.master
+ dir_cntrl.requestToMemory = MessageBuffer()
+ dir_cntrl.responseFromMemory = MessageBuffer()