Make core_sim simulation trace and cycle configurable

To run core_sim with cycles and trace specified

```
core_sim --trace --cycles 50000 <bin path>
```

Change-Id: I8eb7b5aad4d16179bee7ddd31b899a86dfa021f0
diff --git a/rules/repos.bzl b/rules/repos.bzl
index ebcf1b7..e22179c 100644
--- a/rules/repos.bzl
+++ b/rules/repos.bzl
@@ -44,3 +44,10 @@
         strip_prefix = "rules_foreign_cc-0.9.0",
         url = "https://github.com/bazelbuild/rules_foreign_cc/archive/refs/tags/0.9.0.tar.gz",
     )
+
+    http_archive(
+        name = "com_google_absl",
+        sha256 = "3ea49a7d97421b88a8c48a0de16c16048e17725c7ec0f1d3ea2683a2a75adc21",
+        strip_prefix = "abseil-cpp-20230125.0",
+        urls = ["https://github.com/abseil/abseil-cpp/archive/refs/tags/20230125.0.tar.gz"],
+    )
diff --git a/tests/verilator_sim/BUILD b/tests/verilator_sim/BUILD
index d549d23..a974e32 100644
--- a/tests/verilator_sim/BUILD
+++ b/tests/verilator_sim/BUILD
@@ -35,6 +35,9 @@
         ":kelvin_if",
         ":sim_libs",
         "//hdl/chisel:core_cc_library",
+        "@com_google_absl//absl/flags:flag",
+        "@com_google_absl//absl/flags:parse",
+        "@com_google_absl//absl/flags:usage",
     ],
 )
 
@@ -114,7 +117,7 @@
 
 cc_test(
     name = "valuint_tb",
-    size="large",
+    size = "large",
     srcs = [
         "kelvin/valuint_tb.cc",
     ],
diff --git a/tests/verilator_sim/kelvin/core_tb.cc b/tests/verilator_sim/kelvin/core_tb.cc
index c449816..f23c1f7 100644
--- a/tests/verilator_sim/kelvin/core_tb.cc
+++ b/tests/verilator_sim/kelvin/core_tb.cc
@@ -1,13 +1,16 @@
 // Copyright 2023 Google LLC
 
-#include "tests/verilator_sim/sysc_tb.h"
-
-#include "VCore.h"
-
+#include "VCore.h"  // Generated
+#include "absl/flags/flag.h"
+#include "absl/flags/parse.h"
+#include "absl/flags/usage.h"
 #include "tests/verilator_sim/kelvin/core_if.h"
 #include "tests/verilator_sim/kelvin/debug_if.h"
 #include "tests/verilator_sim/kelvin/kelvin_cfg.h"
+#include "tests/verilator_sim/sysc_tb.h"
 
+ABSL_FLAG(int, cycles, 100000000, "Simulation cycles");
+ABSL_FLAG(bool, trace, false, "Dump VCD trace");
 
 struct Core_tb : Sysc_tb {
   sc_in<bool> io_halted;
@@ -21,9 +24,10 @@
   }
 };
 
-static void Core_run(const char* name, const char* bin, const bool trace) {
+static void Core_run(const char* name, const char* bin, const int cycles,
+                     const bool trace) {
   VCore core(name);
-  Core_tb tb("Core_tb", 100000000, /* random= */ false);
+  Core_tb tb("Core_tb", cycles, /* random= */ false);
   Core_if mif("Core_if", bin);
   Debug_if dbg("Debug_if", &mif);
 
@@ -209,7 +213,9 @@
   dbg.io_slog_addr(io_slog_addr);
   dbg.io_slog_data(io_slog_data);
 
-#define BINDAXI(a) core.a(a); mif.a(a)
+#define BINDAXI(a) \
+  core.a(a);       \
+  mif.a(a)
   BINDAXI(io_axi0_write_addr_ready);
   BINDAXI(io_axi0_write_addr_valid);
   BINDAXI(io_axi0_write_addr_bits_addr);
@@ -261,12 +267,17 @@
 }
 
 int sc_main(int argc, char *argv[]) {
-  if (argc <= 1) {
-    printf("Expected binary file argument\n");
-    return -1;
+  absl::SetProgramUsageMessage("Kelvin SystemC simulation tool");
+  auto out_args = absl::ParseCommandLine(argc, argv);
+  argc = out_args.size();
+  argv = &out_args[0];
+  if (argc != 2) {
+    fprintf(stderr, "Need one binary input file\n");
+    return 1;
   }
-
   const char* path = argv[1];
-  Core_run(Sysc_tb::get_name(argv[0]), path, false);
+
+  Core_run(Sysc_tb::get_name(argv[0]), path, absl::GetFlag(FLAGS_cycles),
+           absl::GetFlag(FLAGS_trace));
   return 0;
 }
diff --git a/tests/verilator_sim/sysc_tb.h b/tests/verilator_sim/sysc_tb.h
index b097a7d..6caca7f 100644
--- a/tests/verilator_sim/sysc_tb.h
+++ b/tests/verilator_sim/sysc_tb.h
@@ -16,7 +16,7 @@
 
 using sc_dt::sc_bv;
 
-const char *vcd_path_ = "/tmp/kelvin/vcd";
+const char *vcd_path_ = "/tmp";
 
 #define BIND(a, b) a.b(b)
 #define BIND2(a, b, c) \