Added prime polynomial example, new Pumping function to address scalability challenges with primality testing, and some improvements to the streaming interface, where if you don't stream in values, then the python side doesn't end up printing out some 'empty' stream infos.

This commit is contained in:
Peter Goodman
2017-12-09 16:43:43 -05:00
parent 3aaaf71b85
commit 188d4517d8
11 changed files with 271 additions and 17 deletions
+19 -2
View File
@@ -15,6 +15,7 @@
*/
#include "deepstate/DeepState.h"
#include "deepstate/Log.h"
#include <assert.h>
#include <limits.h>
@@ -195,9 +196,22 @@ int8_t DeepState_Char(void) {
#undef MAKE_SYMBOL_FUNC
void _DeepState_Assume(int expr) {
/* Returns the minimum satisfiable value for a given symbolic value, given
* the constraints present on that value. */
uint32_t DeepState_MinUInt(uint32_t v) {
return v;
}
int32_t DeepState_MinInt(int32_t v) {
return v;
}
void _DeepState_Assume(int expr, const char *expr_str, const char *file,
unsigned line) {
if (!expr) {
DeepState_Abandon("");
DeepState_LogFormat(DeepState_LogFatal, "Assumption %s at %s:%u failed",
expr_str, file, line);
}
}
@@ -248,11 +262,14 @@ const struct DeepState_IndexEntry DeepState_API[] = {
{"IsSymbolicUInt", (void *) DeepState_IsSymbolicUInt},
{"ConcretizeData", (void *) DeepState_ConcretizeData},
{"ConcretizeCStr", (void *) DeepState_ConcretizeCStr},
{"MinUInt", (void *) DeepState_MinUInt},
{"MinInt", (void *) DeepState_MinInt},
/* Logging API. */
{"Log", (void *) DeepState_Log},
/* Streaming API for deferred logging. */
{"ClearStream", (void *) DeepState_ClearStream},
{"LogStream", (void *) DeepState_LogStream},
{"StreamInt", (void *) _DeepState_StreamInt},
{"StreamFloat", (void *) _DeepState_StreamFloat},
+10 -2
View File
@@ -251,6 +251,15 @@ void DeepState_StreamDouble(enum DeepState_LogLevel level, double val) {
_DeepState_StreamFloat(level, format, stream->unpack, &(stream->value.as_fp64));
}
/* Clear the contents of the stream and don't log it. */
void DeepState_ClearStream(enum DeepState_LogLevel level) {
struct DeepState_Stream *stream = &(DeepState_Streams[level]);
if (stream->size) {
memset(stream->message, 0, DeepState_StreamSize);
stream->size = 0;
}
}
/* Flush the contents of the stream to a log. */
void DeepState_LogStream(enum DeepState_LogLevel level) {
struct DeepState_Stream *stream = &(DeepState_Streams[level]);
@@ -258,8 +267,7 @@ void DeepState_LogStream(enum DeepState_LogLevel level) {
stream->message[stream->size] = '\0';
stream->message[DeepState_StreamSize] = '\0';
DeepState_Log(level, stream->message);
memset(stream->message, 0, DeepState_StreamSize);
stream->size = 0;
DeepState_ClearStream(level);
}
}