build.run: add BuildPlan.digest(), useful for caching.
authorwhitequark <whitequark@whitequark.org>
Fri, 23 Aug 2019 01:10:51 +0000 (01:10 +0000)
committerwhitequark <whitequark@whitequark.org>
Fri, 23 Aug 2019 01:10:51 +0000 (01:10 +0000)
nmigen/build/run.py

index c512b1f9c262aa3538a95630ebbbcf5cd0480072..d92ab17ffc4593ec5a0d25c9e798e35da37135a8 100644 (file)
@@ -6,6 +6,7 @@ import sys
 import subprocess
 import tempfile
 import zipfile
+import hashlib
 
 
 __all__ = ["BuildPlan", "BuildProducts", "LocalBuildProducts"]
@@ -32,6 +33,21 @@ class BuildPlan:
         assert isinstance(filename, str) and filename not in self.files
         self.files[filename] = content
 
+    def digest(self, size=64):
+        """
+        Compute a `digest`, a short byte sequence deterministically and uniquely identifying
+        this build plan.
+        """
+        hasher = hashlib.blake2b(digest_size=size)
+        for filename in sorted(self.files):
+            hasher.update(filename.encode("utf-8"))
+            content = self.files[filename]
+            if isinstance(content, str):
+                content = content.encode("utf-8")
+            hasher.update(content)
+        hasher.update(self.script.encode("utf-8"))
+        return hasher.digest()
+
     def archive(self, file):
         """
         Archive files from the build plan into ``file``, which can be either a filename, or