docs: def designPrimers(p3_args, input_log=None, output_log=None, err_log=None):
      ''' Return the raw primer3_core output for the provided primer3 args.
  
      Returns an ordered dict of the boulderIO-format primer3 output file
      '''
      sp = subprocess.Popen([pjoin(PRIMER3_HOME, 'primer3_core')],
                            stdout=subprocess.PIPE, stdin=subprocess.PIPE,
                            stderr=subprocess.STDOUT)
      p3_args.setdefault('PRIMER_THERMODYNAMIC_PARAMETERS_PATH',
                         pjoin(PRIMER3_HOME, 'primer3_config/'))
      in_str = _formatBoulderIO(p3_args)
      if input_log:
          input_log.write(in_str)
          input_log.flush()
      out_str, err_str = sp.communicate(input=in_str)
      if output_log:
          output_log.write(out_str)
          output_log.flush()
      if err_log and err_str is not None:
          err_log.write(err_str)
          err_log.flush()
      return _parseBoulderIO(out_str)