FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

gitで中途半端にaddしたいときの-pの使い方

gitで一気にたくさん修正をしてしまったけど、コミットは別々に分けたい、というときは、interactiveモードを使ってもいいけど、もっと手軽に-pを使おう。

なんか一杯変更してもうたなあ。。。

diff --git a/src_cpp/gen_arch_table.rb b/src_cpp/gen_arch_table.rb
index e9fb073..73c16c7 100755
--- a/src_cpp/gen_arch_table.rb
+++ b/src_cpp/gen_arch_table.rb
@@ -228,7 +228,8 @@ inst_func_fp.printf("    RiscvEnv *m_env;\n")
 inst_func_fp.printf("\npublic:\n");
 inst_func_fp.printf("    InstEnv (RiscvEnv *env);\n\n")
 inst_func_fp.printf("    typedef void (InstEnv::*InstFunc) (Word_t inst_hex);\n");
-inst_func_fp.printf("    static const InstFunc inst_exec_func[];\n\n\n");
+inst_func_fp.printf("    static const InstFunc m_inst_exec_func[];\n\n");
+inst_func_fp.printf("    void RISCV_Inst_Exec (uint32_t index, Word_t inst_hex);\n\n");

 $arch_table.each {|inst_info|
   inst_func_fp.printf("    void RISCV_%s (Word_t inst_hex);\n", inst_info[DEC::INST_NAME]);
@@ -236,7 +237,7 @@ $arch_table.each {|inst_info|

 inst_func_fp.printf("};\n");

-inst_func_fp.puts("const InstEnv::InstFunc InstEnv::inst_exec_func[] = {\n");
+inst_func_fp.puts("const InstEnv::InstFunc InstEnv::m_inst_exec_func[] = {\n");
 $arch_table.each_with_index {|inst_info, index|
   inst_func_fp.printf("    &InstEnv::RISCV_%s", inst_info[DEC::INST_NAME]);
   if (index == $arch_table.size-1) then
diff --git a/src_cpp/inst_riscv.cpp b/src_cpp/inst_riscv.cpp
index 231cecd..7c720de 100644
--- a/src_cpp/inst_riscv.cpp
+++ b/src_cpp/inst_riscv.cpp
@@ -40,6 +40,14 @@ InstEnv::InstEnv (RiscvEnv *env)
 }


+void InstEnv::RISCV_Inst_Exec (uint32_t index, Word_t inst_hex)
+{
+    (this->*m_inst_exec_func[index]) (inst_hex);
+
+    return;
+}
+
+
 void InstEnv::RISCV_INST_LUI (Word_t inst_hex)
 {
     RegAddr_t rd_addr = ExtractRDField (inst_hex);
diff --git a/src_cpp/simulation.cpp b/src_cpp/simulation.cpp
index 883b2d7..9dc696a 100644
--- a/src_cpp/simulation.cpp
+++ b/src_cpp/simulation.cpp
@@ -57,7 +57,7 @@ void RiscvEnv::StepSimulation (int32_t stepCount)
             fprintf (m_dbgfp, "<Error: instruction is not decoded. [%08x]=%08x\n", m_current_pc, inst_hex);
             exit (EXIT_FAILURE);
         } else {
-            (m_inst_env->*m_inst_exec_func[inst_idx]) ();
+            m_inst_env->RISCV_Inst_Exec (inst_idx, inst_hex);

             fprintf (m_dbgfp, "%10d : ", m_step);
             fprintf (m_dbgfp, "[%08x] %08x : ", m_current_pc, inst_hex);

git add -pで小分けにaddしていこう。別のファイルでも、diffのグループが分かれていれば、個別にaddすることができる。

$ git add -p
diff --git a/src_cpp/gen_arch_table.rb b/src_cpp/gen_arch_table.rb
index e9fb073..73c16c7 100755
--- a/src_cpp/gen_arch_table.rb
+++ b/src_cpp/gen_arch_table.rb
@@ -228,7 +228,8 @@ inst_func_fp.printf("    RiscvEnv *m_env;\n")
 inst_func_fp.printf("\npublic:\n");
 inst_func_fp.printf("    InstEnv (RiscvEnv *env);\n\n")
 inst_func_fp.printf("    typedef void (InstEnv::*InstFunc) (Word_t inst_hex);\n");
-inst_func_fp.printf("    static const InstFunc inst_exec_func[];\n\n\n");
+inst_func_fp.printf("    static const InstFunc m_inst_exec_func[];\n\n");
+inst_func_fp.printf("    void RISCV_Inst_Exec (uint32_t index, Word_t inst_hex);\n\n");

 $arch_table.each {|inst_info|
   inst_func_fp.printf("    void RISCV_%s (Word_t inst_hex);\n", inst_info[DEC::INST_NAME]);
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?

で、追加したいならy、省略したいならnを入力していくのだけれど、それ以外のキーって何に使うんだっけ、とか、もう追加し終わったから、終了したいとかはどうするんだけって、となると、?を押す。

Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

ほほう、qを押すと、今時点の変更はキャンセルして、終了するのか。

$ git st
On branch utf8_convert
Your branch is behind 'origin/utf8_convert' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   gen_arch_table.rb
        modified:   simulation.cpp

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   gen_arch_table.rb
        modified:   inst_riscv.cpp

Untracked files:
  (use "git add <file>..." to include in what will be committed)

ばらばらにaddできた。この後、commitすれば良い。