32 std::cout <<
"\n=== Basic Components Demo ===\n";
59 std::cout <<
"Created components:\n";
60 std::cout <<
"- " << resistor->getName() <<
": " << resistor->getDescription() <<
"\n";
61 std::cout <<
"- " << capacitor->getName() <<
": " << capacitor->getDescription() <<
"\n";
62 std::cout <<
"- " << inductor->getName() <<
": " << inductor->getDescription() <<
"\n";
63 std::cout <<
"- " << and_gate->getName() <<
": " << and_gate->getDescription() <<
"\n";
64 std::cout <<
"- " << flip_flop->getName() <<
": " << flip_flop->getDescription() <<
"\n";
72 alu->setType(
"ArithmeticLogicUnit");
76 for (
int i = 0; i < 8; ++i) {
82 alu->addChild(and_gate);
89 alu->addChild(or_gate);
96 alu->addChild(xor_gate);
100 for (
int i = 0; i < 8; ++i) {
104 alu->addChild(adder);
108 alu->setBoundingBox(alu->calculateHierarchicalBoundingBox());
115 alu->setTimingInfo(timing);
117 std::cout <<
"Created ALU with " << alu->getChildren().size()
118 <<
" sub-components\n";
119 std::cout <<
"ALU bounding box: " << alu->getBoundingBox().toString() <<
"\n";
129 std::cout <<
"\n=== Creating Processor Core ===\n";
135 l1_config.
size = 32 * 1024;
140 cpu->setL1Config(l1_config);
143 l2_config.
size = 512 * 1024;
148 cpu->setL2Config(l2_config);
161 fpu->setType(
"FloatingPointUnit");
167 cpu->setBoundingBox(cpu->calculateHierarchicalBoundingBox());
169 std::cout <<
"Processor core configuration:\n";
170 std::cout <<
"- Architecture: ARM Cortex-A53\n";
171 std::cout <<
"- Cores: " << cpu->getCoreCount() <<
"\n";
172 std::cout <<
"- L1 Cache: " << l1_config.
size / 1024 <<
" KB\n";
173 std::cout <<
"- L2 Cache: " << l2_config.
size / 1024 <<
" KB\n";
174 std::cout <<
"- Total sub-components: " << cpu->getTotalGateCount() <<
"\n";
175 std::cout <<
"- Total area: " << cpu->calculateTotalArea() <<
" square units\n";
184 std::cout <<
"\n=== Creating Smartphone SoC ===\n";
186 auto soc = std::make_shared<SoC>(
"SmartphoneSoC",
"Custom_SoC_2nm");
192 soc->addProcessorCore(cpu_cluster);
198 soc->addGPUCore(gpu);
204 soc->addDSPCore(dsp);
210 soc->addMemoryController(memory_ctrl);
216 soc->addInterface(usb_if);
221 soc->addInterface(pcie_if);
224 auto pmu = std::make_shared<PowerManagementUnit>(
"PMU");
227 pmu->addPowerDomain(
"CPU", 1.0, 2.5);
228 pmu->addPowerDomain(
"GPU", 0.9, 3.0);
229 pmu->addPowerDomain(
"DSP", 0.8, 0.5);
230 pmu->addPowerDomain(
"IO", 1.8, 0.3);
234 soc->setBoundingBox(soc->calculateHierarchicalBoundingBox());
236 std::cout <<
"SoC Configuration:\n";
237 std::cout <<
"- Technology: 2nm\n";
238 std::cout <<
"- Total area: " << soc->calculateTotalArea() <<
" square units\n";
239 std::cout <<
"- Total power: " << soc->getTotalPower() <<
" W\n";
240 std::cout <<
"- Processor cores: " << cpu_cluster->getCoreCount() <<
"\n";
241 std::cout <<
"- GPU compute units: " << gpu->getComputeUnits() <<
"\n";
242 std::cout <<
"- Memory channels: " << memory_ctrl->getChannelCount() <<
"\n";
243 std::cout <<
"- Total gate count: " << soc->getTotalGateCount() <<
"\n";
252 std::cout <<
"\n=== Hierarchical Optimization Demo ===\n";
255 std::vector<std::shared_ptr<Component>> socs;
257 for (
int i = 0; i < 8; ++i) {
259 soc->setName(
"SoC_" + std::to_string(i));
262 double x = (i % 4) * 400.0;
263 double y = (i / 4) * 200.0;
269 std::cout <<
"\nCreated " << socs.size() <<
" SoCs for server design\n";
272 size_t total_components = 0;
273 double total_area = 0.0;
275 for (
const auto& soc : socs) {
276 total_components += soc->getTotalGateCount();
277 total_area += soc->calculateTotalArea();
280 std::cout <<
"Total design complexity:\n";
281 std::cout <<
"- Total components: " << total_components <<
"\n";
282 std::cout <<
"- Total area: " << total_area <<
" square units\n";
285 std::cout <<
"\nHierarchical Optimization Benefits:\n";
286 std::cout <<
"- Without hierarchy: Need to optimize " << total_components
287 <<
" individual components\n";
288 std::cout <<
"- With hierarchy: Optimize " << socs.size()
289 <<
" SoC blocks at top level\n";
290 std::cout <<
"- Complexity reduction: "
291 << (double)total_components / socs.size() <<
"x\n";
295 auto spatial_index = std::make_unique<HierarchicalSpatialIndex>(boundary, 16, 8);
298 for (
const auto& soc : socs) {
299 spatial_index->insert(soc, [](std::shared_ptr<Component> comp) {
300 return comp->getBoundingBox();
304 std::cout <<
"\nSpatial indexing completed for hierarchical optimization\n";
307 auto timing_optimizer = std::make_unique<TimingDrivenOptimizer>(boundary);
310 timing_optimizer->addTimingConstraint(
"CPU_to_Memory", 5.0);
311 timing_optimizer->addTimingConstraint(
"CPU_to_GPU", 3.0);
312 timing_optimizer->addTimingConstraint(
"Clock", 1.0);
314 std::cout <<
"Added timing constraints for critical paths\n";
317 auto start_time = std::chrono::high_resolution_clock::now();
319 for (
int iteration = 0; iteration < 10; ++iteration) {
321 for (
auto& soc : socs) {
329 if (distance > 1.0) {
332 soc->setPosition(new_pos);
337 auto end_time = std::chrono::high_resolution_clock::now();
338 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
339 end_time - start_time).count();
341 std::cout <<
"Hierarchical optimization completed in " << duration <<
" ms\n";
348 std::cout <<
"\n=== Optimization Benchmark ===\n";
351 std::vector<size_t> component_counts = {1000, 10000, 100000, 1000000};
353 for (
size_t count : component_counts) {
354 std::cout <<
"\nBenchmarking with " << count <<
" components:\n";
357 std::vector<std::shared_ptr<Component>>
components;
358 std::random_device rd;
359 std::mt19937 gen(rd());
360 std::uniform_real_distribution<> pos_dist(0.0, 1000.0);
361 std::uniform_real_distribution<> size_dist(1.0, 10.0);
363 for (
size_t i = 0; i < count; ++i) {
364 auto comp = std::make_shared<Component>(
"Comp_" + std::to_string(i),
367 double x = pos_dist(gen);
368 double y = pos_dist(gen);
369 double w = size_dist(gen);
370 double h = size_dist(gen);
379 auto start_time = std::chrono::high_resolution_clock::now();
382 auto flat_optimizer = std::make_unique<SimulatedAnnealingOptimizer>(boundary);
383 flat_optimizer->setComponentCount(count);
386 for (
int iter = 0; iter < 100; ++iter) {
391 double new_x = pos_dist(gen);
392 double new_y = pos_dist(gen);
396 auto end_time = std::chrono::high_resolution_clock::now();
397 auto flat_duration = std::chrono::duration_cast<std::chrono::microseconds>(
398 end_time - start_time).count();
401 start_time = std::chrono::high_resolution_clock::now();
404 size_t block_size = std::min(count / 100,
size_t(1000));
405 size_t block_count = (count + block_size - 1) / block_size;
407 std::vector<std::shared_ptr<Component>> blocks;
408 for (
size_t b = 0; b < block_count; ++b) {
409 auto block = std::make_shared<Component>(
"Block_" + std::to_string(b),
413 size_t start_idx = b * block_size;
414 size_t end_idx = std::min(start_idx + block_size, count);
416 for (
size_t i = start_idx; i < end_idx; ++i) {
420 block->setBoundingBox(block->calculateHierarchicalBoundingBox());
421 blocks.push_back(block);
425 auto hierarchical_optimizer = std::make_unique<HierarchicalOptimizer>(boundary);
426 hierarchical_optimizer->setHierarchyDepth(2);
428 for (
int iter = 0; iter < 100; ++iter) {
430 if (!blocks.empty()) {
431 size_t idx = gen() % blocks.size();
432 auto& block = blocks[idx];
434 double new_x = pos_dist(gen);
435 double new_y = pos_dist(gen);
440 end_time = std::chrono::high_resolution_clock::now();
441 auto hierarchical_duration = std::chrono::duration_cast<std::chrono::microseconds>(
442 end_time - start_time).count();
445 std::cout <<
"- Flat optimization: " << flat_duration <<
" μs\n";
446 std::cout <<
"- Hierarchical optimization: " << hierarchical_duration <<
" μs\n";
447 std::cout <<
"- Speedup: " << (double)flat_duration / hierarchical_duration <<
"x\n";
448 std::cout <<
"- Hierarchy levels: " << 2 <<
"\n";
449 std::cout <<
"- Blocks created: " << blocks.size() <<
"\n";
450 std::cout <<
"- Components per block: " << block_size <<
"\n";