compare_schematics.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. Copyright 2010 Intel Corporation
  3. Use, modification and distribution are subject to the Boost Software License,
  4. Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt).
  6. */
  7. //compare_schematics.hpp
  8. #ifndef BOOST_POLYGON_TUTORIAL_COMPARE_SCHEMATICS_HPP
  9. #define BOOST_POLYGON_TUTORIAL_COMPARE_SCHEMATICS_HPP
  10. #include <string>
  11. #include "schematic_database.hpp"
  12. bool compare_connectivity(std::string& ref_net, std::string& net,
  13. schematic_database& reference_schematic,
  14. schematic_database& schematic,
  15. std::vector<std::size_t>& reference_to_internal_device_map,
  16. std::size_t node_id) {
  17. std::set<std::size_t>& ref_nodes = reference_schematic.nets[ref_net];
  18. std::set<std::size_t>& nodes = schematic.nets[net];
  19. for(std::set<std::size_t>::iterator itr = ref_nodes.begin();
  20. itr != ref_nodes.end() && *itr < node_id; ++itr) {
  21. if(nodes.find(reference_to_internal_device_map[*itr]) == nodes.end())
  22. return false;
  23. }
  24. return true;
  25. }
  26. bool compare_schematics_recursive
  27. (schematic_database& reference_schematic,
  28. schematic_database& schematic,
  29. std::vector<std::size_t>& reference_to_internal_device_map,
  30. std::set<std::size_t>& assigned_devices, std::size_t node_id){
  31. //do check of equivalence up to this node
  32. for(std::size_t i = 0; i < node_id; ++i) {
  33. for(std::size_t j = 0; j < reference_schematic.devices[i].terminals.size(); ++j) {
  34. device& rd = reference_schematic.devices[i];
  35. device& xd = schematic.devices[reference_to_internal_device_map[i]];
  36. if(rd.type == "PIN") {
  37. if(rd.terminals[j] != xd.terminals[j])
  38. return false;
  39. } else {
  40. //connectivity must be the same
  41. if(j == 1) {
  42. //gate has to be the same net
  43. if(!compare_connectivity(rd.terminals[1], xd.terminals[1], reference_schematic, schematic,
  44. reference_to_internal_device_map, node_id))
  45. return false;
  46. } else {
  47. //order of nets in source and drain is not important so check both ways and accept either
  48. if(!compare_connectivity(rd.terminals[j], xd.terminals[0], reference_schematic, schematic,
  49. reference_to_internal_device_map, node_id) &&
  50. !compare_connectivity(rd.terminals[j], xd.terminals[2], reference_schematic, schematic,
  51. reference_to_internal_device_map, node_id))
  52. return false;
  53. }
  54. }
  55. }
  56. }
  57. if(node_id >= reference_schematic.devices.size())
  58. return true; //final success
  59. //recurse into subsequent nodes
  60. for(std::size_t i = 0; i < schematic.devices.size(); ++i) {
  61. if(reference_schematic.devices[node_id].type !=
  62. schematic.devices[i].type)
  63. continue; //skip dissimilar devices
  64. //avoid multi-assignment of devices
  65. if(assigned_devices.find(i) == assigned_devices.end()) {
  66. reference_to_internal_device_map[node_id] = i;
  67. std::set<std::size_t>::iterator itr = assigned_devices.insert(assigned_devices.end(), i);
  68. if(compare_schematics_recursive(reference_schematic, schematic,
  69. reference_to_internal_device_map,
  70. assigned_devices, node_id + 1))
  71. return true;
  72. assigned_devices.erase(itr);
  73. }
  74. }
  75. //could not find match between schematics
  76. return false;
  77. }
  78. //this is a trivial brute force comparison algorithm because comparing
  79. //schematics does not require the use of Boost.Polygon and doing it more
  80. //optimally does not add to the tutorial
  81. inline bool compare_schematics(schematic_database& reference_schematic,
  82. schematic_database& schematic) {
  83. std::vector<std::size_t>
  84. reference_to_internal_device_map(reference_schematic.devices.size(), 0);
  85. std::set<std::size_t> assigned_devices;
  86. return compare_schematics_recursive(reference_schematic, schematic,
  87. reference_to_internal_device_map,
  88. assigned_devices, 0);
  89. }
  90. #endif