You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.6 KiB

  1. import re
  2. compound = {}
  3. base_comp = set()
  4. def get_input(comp):
  5. ret = {}
  6. ret['type'] = input('type: ').lower()
  7. ret['parents'] = set()
  8. if type == 'compound':
  9. ret['sub'] = {}
  10. first = True
  11. while True:
  12. i = input('sub: ' if first else '>').lower()
  13. if i == 'end':
  14. break
  15. if i != ''
  16. s = re.split(r' *\* ',i)
  17. if len(s) == 2:
  18. name,count = s
  19. else:
  20. name = s[0]
  21. count = 0
  22. ret[name] = int(count)
  23. first = False
  24. return ret
  25. def get_sub(comp):
  26. # either not base component or not entered yet
  27. if comp not in base_comp:
  28. try:
  29. # check to see if it is already entered
  30. subs = compound[comp]
  31. except KeyError:
  32. # entry
  33. subs = get_input(comp)
  34. if subs['type'] == 'base':
  35. base_comp.add(comp)
  36. else:
  37. compound[comp] = subs
  38. return subs
  39. def __inner__(comp,count,bases,components,prev = None):
  40. component_data = get_sub(comp)
  41. if prev:
  42. component_data['parents'].add(prev)
  43. # not a compound component
  44. if component_data is None:
  45. prev = bases.get(comp,0)
  46. bases[comp] = prev + count
  47. else:
  48. prev = components.get(comp,0)
  49. components[comp] = prev + count
  50. for sub,count in component_data['sub']:
  51. __inner__(sub,count,bases,components,comp)
  52. def get_overall_usage(comp):
  53. ret_bases = {}
  54. ret_components = {}