topological_sort.sf 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Topological_sort
  4. #
  5. func print_topo_sort (deps) {
  6. var ba = Hash.new;
  7. deps.each { |before, afters|
  8. afters.each { |after|
  9. if (before != after) {
  10. ba{before}{after} = 1;
  11. };
  12. ba{after} \\= Hash.new;
  13. }
  14. };
  15. loop {
  16. var afters = ba.keys.grep {|k| ba{k}.values.len == 0 }.sort;
  17. afters.len || break;
  18. say afters.join(" ");
  19. ba.delete(afters...);
  20. ba.values.each { |v| v.delete(afters...) };
  21. };
  22. say (ba.len ? "Cicle found! #{ba.keys.sort}" : "---");
  23. }
  24. var deps = Hash.new(
  25. des_system_lib => < std synopsys std_cell_lib des_system_lib dw02
  26. dw01 ramlib ieee >,
  27. dw01 => < ieee dw01 dware gtech >,
  28. dw02 => < ieee dw02 dware >,
  29. dw03 => < std synopsys dware dw03 dw02 dw01 ieee gtech >,
  30. dw04 => < dw04 ieee dw01 dware gtech >,
  31. dw05 => < dw05 ieee dware >,
  32. dw06 => < dw06 ieee dware >,
  33. dw07 => < ieee dware >,
  34. dware => < ieee dware >,
  35. gtech => < ieee gtech >,
  36. ramlib => < std ieee >,
  37. std_cell_lib => < ieee std_cell_lib >,
  38. synopsys => < >
  39. );
  40. print_topo_sort(deps);
  41. deps{:dw01}.append('dw04'); # Add unresolvable dependency
  42. print_topo_sort(deps);