old_contents: import argparse
  
  def main():
      parser = argparse.ArgumentParser("Form ZDB groups for BUFG.")
      
      parser.add_argument('bot_r')
      parser.add_argument('top_r')
  
      args = parser.parse_args()
  
      groups = {}
  
      with open(args.bot_r) as f:
          for l in f:
              parts = l.strip().split(' ')
              feature = parts[0]
              bits = parts[1:]
              tile_type, dst, src = feature.split('.')
  
              assert tile_type == "CLK_BUFG"
  
              if dst not in groups:
                  groups[dst] = {}
  
              groups[dst][src] = bits
  
      for dst in groups:
          if len(groups[dst]) == 1:
              continue
  
          bits = set()
          zero_feature = None
          for src in groups[dst]:
              if groups[dst][src][0] == '<0':
                  assert zero_feature is None
                  zero_feature = src
              else:
                  bits |= set(groups[dst][src])
  
          assert zero_feature is not None, dst
  
          print('{bits},{type}.{dst}.{src}'.format(
              bits=' '.join(sorted(bits)),
              type='CLK_BUFG',
              dst=dst,
              src=zero_feature))
  
  if __name__ == "__main__":
      main()
  
new_contents: """ Tool for building ZDB for BUFG pips.
  
  This requires that the rdb files be good enough to identify all the 0 candidate
  features, which may take multiple manual iterations.  Manual iterations can
  be running like:
  
  make ITER=<N> -j<J> database
  
  And then invoking:
  python3 build_zdb.py build/segbits_clk_bufg_bot_r.rdb build/segbits_clk_bufg_top_r.rdb > bits.dbf
  
  will successed if and only if the rdb is complete enough.
  
  bits.dbf is committed, so this utility should only be needed to document the
  process.
  
  """
  import argparse
  
  def main():
      parser = argparse.ArgumentParser("Form ZDB groups for BUFG.")
  
      parser.add_argument('bot_r')
      parser.add_argument('top_r')
  
      args = parser.parse_args()
  
      groups = {}
  
      with open(args.bot_r) as f:
          for l in f:
              parts = l.strip().split(' ')
              feature = parts[0]
              bits = parts[1:]
              tile_type, dst, src = feature.split('.')
  
              assert tile_type == "CLK_BUFG"
  
              if dst not in groups:
                  groups[dst] = {}
  
              groups[dst][src] = bits
  
      for dst in groups:
          if len(groups[dst]) == 1:
              continue
  
          bits = set()
          zero_feature = None
          for src in groups[dst]:
              if groups[dst][src][0] == '<0':
                  assert zero_feature is None
                  zero_feature = src
              else:
                  bits |= set(groups[dst][src])
  
          assert zero_feature is not None, dst
  
          print('{bits},{type}.{dst}.{src}'.format(
              bits=' '.join(sorted(bits)),
              type='CLK_BUFG',
              dst=dst,
              src=zero_feature))
  
  if __name__ == "__main__":
      main()
  
subject: Add comment to build_zdb.