diff --git a/tools/speclib.c b/tools/speclib.c
index e7aa56b8edb89d6e4007ee59b6a08dc265c2158b..f6b6ef11010593ae9dc5f0b37c18f9bdae008af3 100644
--- a/tools/speclib.c
+++ b/tools/speclib.c
@@ -270,9 +270,20 @@ static char *load_binary_file(const char *filename, size_t *size)
 	return buf;
 }
 
-int spec_load_bitstream(void *card, const char *filename)
+int spec_load_bitstream_buffer(void *card, void *buf, size_t size)
 {
 	struct spec_private *p = (struct spec_private *) card;
+	int rv;
+
+	rv = loader_low_level(0, p->bar4, buf, size);
+	waitdone_low_level(0, p->bar4);
+	gpiofix_low_level(0, p->bar4);
+
+	return rv;
+}
+
+int spec_load_bitstream(void *card, const char *filename)
+{
 	char *buf;
 	size_t size;
 	int rv;
@@ -281,9 +292,7 @@ int spec_load_bitstream(void *card, const char *filename)
 	if(!buf)
 		return -1;
 
-	rv = loader_low_level(0, p->bar4, buf, size);
-	waitdone_low_level(0, p->bar4);
-	gpiofix_low_level(0, p->bar4);
+	rv = spec_load_bitstream_buffer(card, buf, size);
 
 	free(buf);
 	return rv;
diff --git a/tools/speclib.h b/tools/speclib.h
index a78b72f4b6ddc59fa253c9ccf2284e4e891a8325..87fec46ceca89dd62de8e03c90a7f698b794e71b 100644
--- a/tools/speclib.h
+++ b/tools/speclib.h
@@ -20,6 +20,10 @@ void spec_close(void *card);
    Returns 0 on success. */
 int spec_load_bitstream(void *card, const char *filename);
 
+/* Load the FPGA bitstram into car [card] from a given buffer [buf]
+   of size [size] */
+int spec_load_bitstream_buffer(void *card, void *buf, size_t size);
+
 /* Loads the WRC LM32 firmware into card [card] from file [filename]. starting at 
    address [base_addr]. Returns 0 on success. 
    WARNING: using improper base address/FPGA firmware will freeze the computer. */