You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

262 lines
5.5 KiB

/*
* Copyright 2011-2015 Formal Methods and Tools, University of Twente
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <lace.h>
#include <sylvan_config.h>
#ifndef SYLVAN_STATS_H
#define SYLVAN_STATS_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef enum {
BDD_ITE,
BDD_AND,
BDD_XOR,
BDD_EXISTS,
BDD_AND_EXISTS,
BDD_RELNEXT,
BDD_RELPREV,
BDD_SATCOUNT,
BDD_COMPOSE,
BDD_RESTRICT,
BDD_CONSTRAIN,
BDD_CLOSURE,
BDD_ISBDD,
BDD_SUPPORT,
BDD_PATHCOUNT,
BDD_ITE_CACHEDPUT,
BDD_AND_CACHEDPUT,
BDD_XOR_CACHEDPUT,
BDD_EXISTS_CACHEDPUT,
BDD_AND_EXISTS_CACHEDPUT,
BDD_RELNEXT_CACHEDPUT,
BDD_RELPREV_CACHEDPUT,
BDD_SATCOUNT_CACHEDPUT,
BDD_COMPOSE_CACHEDPUT,
BDD_RESTRICT_CACHEDPUT,
BDD_CONSTRAIN_CACHEDPUT,
BDD_CLOSURE_CACHEDPUT,
BDD_ISBDD_CACHEDPUT,
BDD_SUPPORT_CACHEDPUT,
BDD_PATHCOUNT_CACHEDPUT,
BDD_ITE_CACHED,
BDD_AND_CACHED,
BDD_XOR_CACHED,
BDD_EXISTS_CACHED,
BDD_AND_EXISTS_CACHED,
BDD_RELNEXT_CACHED,
BDD_RELPREV_CACHED,
BDD_SATCOUNT_CACHED,
BDD_COMPOSE_CACHED,
BDD_RESTRICT_CACHED,
BDD_CONSTRAIN_CACHED,
BDD_CLOSURE_CACHED,
BDD_ISBDD_CACHED,
BDD_SUPPORT_CACHED,
BDD_PATHCOUNT_CACHED,
BDD_NODES_CREATED,
BDD_NODES_REUSED,
LDD_UNION,
LDD_MINUS,
LDD_INTERSECT,
LDD_RELPROD,
LDD_RELPREV,
LDD_PROJECT,
LDD_JOIN,
LDD_MATCH,
LDD_SATCOUNT,
LDD_SATCOUNTL,
LDD_ZIP,
LDD_RELPROD_UNION,
LDD_PROJECT_MINUS,
LDD_UNION_CACHEDPUT,
LDD_MINUS_CACHEDPUT,
LDD_INTERSECT_CACHEDPUT,
LDD_RELPROD_CACHEDPUT,
LDD_RELPREV_CACHEDPUT,
LDD_PROJECT_CACHEDPUT,
LDD_JOIN_CACHEDPUT,
LDD_MATCH_CACHEDPUT,
LDD_SATCOUNT_CACHEDPUT,
LDD_SATCOUNTL_CACHEDPUT,
LDD_ZIP_CACHEDPUT,
LDD_RELPROD_UNION_CACHEDPUT,
LDD_PROJECT_MINUS_CACHEDPUT,
LDD_UNION_CACHED,
LDD_MINUS_CACHED,
LDD_INTERSECT_CACHED,
LDD_RELPROD_CACHED,
LDD_RELPREV_CACHED,
LDD_PROJECT_CACHED,
LDD_JOIN_CACHED,
LDD_MATCH_CACHED,
LDD_SATCOUNT_CACHED,
LDD_SATCOUNTL_CACHED,
LDD_ZIP_CACHED,
LDD_RELPROD_UNION_CACHED,
LDD_PROJECT_MINUS_CACHED,
LDD_NODES_CREATED,
LDD_NODES_REUSED,
LLMSSET_LOOKUP,
SYLVAN_GC_COUNT,
SYLVAN_COUNTER_COUNTER
} Sylvan_Counters;
typedef enum
{
SYLVAN_GC,
SYLVAN_TIMER_COUNTER
} Sylvan_Timers;
/**
* Initialize stats system (done by sylvan_init_package)
*/
#define sylvan_stats_init() CALL(sylvan_stats_init)
VOID_TASK_DECL_0(sylvan_stats_init)
/**
* Reset all counters (for statistics)
*/
#define sylvan_stats_reset() CALL(sylvan_stats_reset)
VOID_TASK_DECL_0(sylvan_stats_reset)
/**
* Write statistic report to file (stdout, stderr, etc)
*/
void sylvan_stats_report(FILE* target, int color);
#if SYLVAN_STATS
/* Infrastructure for internal markings */
typedef struct
{
uint64_t counters[SYLVAN_COUNTER_COUNTER];
uint64_t timers[SYLVAN_TIMER_COUNTER];
uint64_t timers_startstop[SYLVAN_TIMER_COUNTER];
} sylvan_stats_t;
#ifdef __MACH__
#include <mach/mach_time.h>
#define getabstime() mach_absolute_time()
#else
#include <time.h>
static uint64_t
getabstime()
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
uint64_t t = ts.tv_sec;
t *= 1000000000UL;
t += ts.tv_nsec;
return t;
}
#endif
#ifdef __ELF__
extern __thread sylvan_stats_t sylvan_stats;
#else
#include <pthread.h>
extern pthread_key_t sylvan_stats_key;
#endif
static inline void
sylvan_stats_count(size_t counter)
{
#ifdef __ELF__
sylvan_stats.counters[counter]++;
#else
sylvan_stats_t *sylvan_stats = (sylvan_stats_t*)pthread_getspecific(sylvan_stats_key);
sylvan_stats->counters[counter]++;
#endif
}
static inline void
sylvan_stats_add(size_t counter, size_t amount)
{
#ifdef __ELF__
sylvan_stats.counters[counter]+=amount;
#else
sylvan_stats_t *sylvan_stats = (sylvan_stats_t*)pthread_getspecific(sylvan_stats_key);
sylvan_stats->counters[counter]+=amount;
#endif
}
static inline void
sylvan_timer_start(size_t timer)
{
uint64_t t = getabstime();
#ifdef __ELF__
sylvan_stats.timers_startstop[timer] = t;
#else
sylvan_stats_t *sylvan_stats = (sylvan_stats_t*)pthread_getspecific(sylvan_stats_key);
sylvan_stats->timers_startstop[timer] = t;
#endif
}
static inline void
sylvan_timer_stop(size_t timer)
{
uint64_t t = getabstime();
#ifdef __ELF__
sylvan_stats.timers[timer] += (t - sylvan_stats.timers_startstop[timer]);
#else
sylvan_stats_t *sylvan_stats = (sylvan_stats_t*)pthread_getspecific(sylvan_stats_key);
sylvan_stats->timers[timer] += (t - sylvan_stats->timers_startstop[timer]);
#endif
}
#else
static inline void
sylvan_stats_count(size_t counter)
{
(void)counter;
}
static inline void
sylvan_stats_add(size_t counter, size_t amount)
{
(void)counter;
(void)amount;
}
static inline void
sylvan_timer_start(size_t timer)
{
(void)timer;
}
static inline void
sylvan_timer_stop(size_t timer)
{
(void)timer;
}
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif