示例#1
0
 def test_first_n_seeds(self, seed):
     rng = ast_generator.RngState(seed)
     run_fuzz.run_fuzz(
         rng,
         ast_generator.AstGeneratorOptions(
             disallow_divide=True, binop_allowlist=[ast.BinopKind.SHLL]),
         **self.KWARGS)
def setup_generator():
    return dict(queues=(_DummyQueue(), ),
                seed=0,
                ast_generator_options=ast_generator.AstGeneratorOptions(
                    disallow_divide=DISALLOW_DIVIDE),
                sample_count=16,
                duration=None,
                calls_per_sample=CALLS_PER_SAMPLE,
                print_samples=False)
示例#3
0
def setup_worker():
    """Creates arguments to repeatedly pass to benchmark_worker."""
    rng = ast_generator.RngState(0)
    smp = ast_generator.generate_sample(
        ast_generator.AstGeneratorOptions(disallow_divide=DISALLOW_DIVIDE),
        CALLS_PER_SAMPLE,
        sample.SampleOptions(convert_to_ir=True,
                             optimize_ir=True,
                             codegen=FLAGS.codegen,
                             simulate=FLAGS.simulate), rng)

    run_dir = tempfile.mkdtemp('run_fuzz_')
    return (run_dir, smp)
示例#4
0
 def test_generate_codegen_sample(self):
   rng = ast_generator.RngState(0)
   sample = sample_generator.generate_sample(
       rng,
       ast_generator.AstGeneratorOptions(),
       calls_per_sample=0,
       default_options=SampleOptions(
           convert_to_ir=True, optimize_ir=True, codegen=True, simulate=True))
   self.assertTrue(sample.options.input_is_dslx)
   self.assertTrue(sample.options.convert_to_ir)
   self.assertTrue(sample.options.optimize_ir)
   self.assertTrue(sample.options.codegen)
   self.assertTrue(sample.options.simulate)
   self.assertNotEmpty(sample.options.codegen_args)
   self.assertEmpty(sample.args_batch)
示例#5
0
 def test_generate_basic_sample(self):
   rng = ast_generator.RngState(0)
   sample = sample_generator.generate_sample(
       rng,
       ast_generator.AstGeneratorOptions(),
       calls_per_sample=3,
       default_options=SampleOptions(
           convert_to_ir=True, optimize_ir=True, codegen=False,
           simulate=False))
   self.assertTrue(sample.options.input_is_dslx)
   self.assertTrue(sample.options.convert_to_ir)
   self.assertTrue(sample.options.optimize_ir)
   self.assertFalse(sample.options.codegen)
   self.assertFalse(sample.options.simulate)
   self.assertLen(sample.args_batch, 3)
   self.assertIn('fn main', sample.input_text)
示例#6
0
 def _get_ast_options(self) -> ast_generator.AstGeneratorOptions:
     return ast_generator.AstGeneratorOptions(disallow_divide=True)
示例#7
0
def main(argv):
    if len(argv) > 1:
        raise app.UsageError('Too many command-line arguments.')

    if FLAGS.simulate and not FLAGS.codegen:
        raise app.UsageError(
            'Must specify --codegen when --simulate is given.')

    # Test that we can write to the crash and summary path.
    for path in (FLAGS.crash_path, FLAGS.summary_path):
        if path:
            gfile.make_dirs(path)
            with gfile.open(os.path.join(path, 'test'), 'w') as f:
                print('test', file=f)

    start = datetime.datetime.now()

    physical_core_count = psutil.cpu_count(logical=False)
    worker_count = FLAGS.worker_count or physical_core_count
    worker_count = max(worker_count, 1)  # Need at least one worker.
    queues = (multiprocess.get_user_data()
              or [mp.Queue() for _ in range(worker_count)])
    queues = queues[:worker_count]
    print('-- Creating pool of {} workers; physical core count {}'.format(
        worker_count, physical_core_count))
    workers = []
    for i in range(worker_count):
        queue = None if multiprocess.has_user_data_support() else queues[i]

        target = run_fuzz_multiprocess.do_worker_task
        args = (i, queue, FLAGS.crash_path, FLAGS.summary_path,
                FLAGS.save_temps_path, FLAGS.minimize_ir)

        worker = multiprocess.Process(target=target, args=args)

        worker.start()
        workers.append(worker)

    duration_str = FLAGS.duration
    duration = None if duration_str is None else cli_helpers.parse_duration(
        duration_str)

    seed = FLAGS.seed
    if not seed:
        seed = random.randrange(0, 1 << 31)
        print('-- Using randomly generated seed:', seed)
        sys.stdout.flush()

    generator_options = ast_generator.AstGeneratorOptions(
        disallow_divide=FLAGS.disallow_divide,
        emit_loops=FLAGS.emit_loops,
        short_samples=FLAGS.short_samples,
        max_width_bits_types=FLAGS.max_width_bits_types,
        max_width_aggregate_types=FLAGS.max_width_aggregate_types,
        emit_gate=not FLAGS.codegen)

    default_sample_options = sample.SampleOptions(
        convert_to_ir=True,
        optimize_ir=True,
        use_jit=FLAGS.use_llvm_jit,
        codegen=FLAGS.codegen,
        simulate=FLAGS.simulate,
        simulator=FLAGS.simulator,
        use_system_verilog=FLAGS.use_system_verilog)
    sample_count = run_fuzz_multiprocess.do_generator_task(
        queues,
        seed,
        generator_options,
        FLAGS.sample_count,
        FLAGS.calls_per_sample,
        default_sample_options=default_sample_options,
        duration=duration,
        print_samples=FLAGS.print_samples)

    for i, worker in enumerate(workers):
        print('-- Joining on worker {}'.format(i))
        worker.join()

    delta = datetime.datetime.now() - start
    elapsed = delta.total_seconds()
    print(
        '-- Elapsed end-to-end: {} = {:.2f} seconds; {:,} samples; {:.2f} samples/s'
        .format(delta, elapsed, sample_count, sample_count / elapsed))
示例#8
0
 def _get_options(self, codegen: bool) -> ast_generator.AstGeneratorOptions:
     # TODO(https://github.com/google/xls/issues/469) Can't emit gate operation
     # with the current fuzzer codegen strategy.
     return ast_generator.AstGeneratorOptions(disallow_divide=True,
                                              emit_gate=not codegen)
示例#9
0
 def _get_ast_options(self) -> ast_generator.AstGeneratorOptions:
     return ast_generator.AstGeneratorOptions(disallow_divide=True,
                                              emit_gate=not FLAGS.codegen)