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.
 
 
 
 

239 lines
5.4 KiB

/*
* Copyright 2011-2016 Formal Methods and Tools, University of Twente
* Copyright 2016-2017 Tom van Dijk, Johannes Kepler University Linz
*
* 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.
*/
/* Do not include this file directly. Instead, include sylvan.h */
#ifndef SYLVAN_STATS_H
#define SYLVAN_STATS_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define OPCOUNTER(NAME) NAME, NAME ## _CACHEDPUT, NAME ## _CACHED
typedef enum {
/* Creating nodes */
BDD_NODES_CREATED,
BDD_NODES_REUSED,
LDD_NODES_CREATED,
LDD_NODES_REUSED,
/* BDD operations */
OPCOUNTER(BDD_ITE),
OPCOUNTER(BDD_AND),
OPCOUNTER(BDD_XOR),
OPCOUNTER(BDD_EXISTS),
OPCOUNTER(BDD_PROJECT),
OPCOUNTER(BDD_AND_EXISTS),
OPCOUNTER(BDD_AND_PROJECT),
OPCOUNTER(BDD_RELNEXT),
OPCOUNTER(BDD_RELPREV),
OPCOUNTER(BDD_SATCOUNT),
OPCOUNTER(BDD_COMPOSE),
OPCOUNTER(BDD_RESTRICT),
OPCOUNTER(BDD_CONSTRAIN),
OPCOUNTER(BDD_CLOSURE),
OPCOUNTER(BDD_ISBDD),
OPCOUNTER(BDD_SUPPORT),
OPCOUNTER(BDD_PATHCOUNT),
/* MTBDD operations */
OPCOUNTER(MTBDD_APPLY),
OPCOUNTER(MTBDD_UAPPLY),
OPCOUNTER(MTBDD_ABSTRACT),
OPCOUNTER(MTBDD_ITE),
OPCOUNTER(MTBDD_EQUAL_NORM),
OPCOUNTER(MTBDD_EQUAL_NORM_REL),
OPCOUNTER(MTBDD_LEQ),
OPCOUNTER(MTBDD_LESS),
OPCOUNTER(MTBDD_GEQ),
OPCOUNTER(MTBDD_GREATER),
OPCOUNTER(MTBDD_AND_ABSTRACT_PLUS),
OPCOUNTER(MTBDD_AND_ABSTRACT_MAX),
OPCOUNTER(MTBDD_COMPOSE),
OPCOUNTER(MTBDD_MINIMUM),
OPCOUNTER(MTBDD_MAXIMUM),
OPCOUNTER(MTBDD_EVAL_COMPOSE),
/* LDD operations */
OPCOUNTER(LDD_UNION),
OPCOUNTER(LDD_MINUS),
OPCOUNTER(LDD_INTERSECT),
OPCOUNTER(LDD_RELPROD),
OPCOUNTER(LDD_RELPREV),
OPCOUNTER(LDD_PROJECT),
OPCOUNTER(LDD_JOIN),
OPCOUNTER(LDD_MATCH),
OPCOUNTER(LDD_SATCOUNT),
OPCOUNTER(LDD_SATCOUNTL),
OPCOUNTER(LDD_ZIP),
OPCOUNTER(LDD_RELPROD_UNION),
OPCOUNTER(LDD_PROJECT_MINUS),
/* Other counters */
SYLVAN_GC_COUNT,
LLMSSET_LOOKUP,
SYLVAN_COUNTER_COUNTER
} Sylvan_Counters;
#undef OPCOUNTER
typedef enum
{
SYLVAN_GC,
SYLVAN_TIMER_COUNTER
} Sylvan_Timers;
typedef struct
{
uint64_t counters[SYLVAN_COUNTER_COUNTER];
/* the timers are in ns */
uint64_t timers[SYLVAN_TIMER_COUNTER];
/* startstop is for internal use */
uint64_t timers_startstop[SYLVAN_TIMER_COUNTER];
} sylvan_stats_t;
/**
* Initialize stats system (done by sylvan_init_package)
*/
VOID_TASK_DECL_0(sylvan_stats_init);
#define sylvan_stats_init() CALL(sylvan_stats_init)
/**
* Reset all counters (for statistics)
*/
VOID_TASK_DECL_0(sylvan_stats_reset);
#define sylvan_stats_reset() CALL(sylvan_stats_reset)
/**
* Obtain current counts (this stops the world during counting)
*/
VOID_TASK_DECL_1(sylvan_stats_snapshot, sylvan_stats_t*);
#define sylvan_stats_snapshot(target) CALL(sylvan_stats_snapshot, target)
/**
* Write statistic report to file (stdout, stderr, etc)
*/
void sylvan_stats_report(FILE* target);
#if SYLVAN_STATS
#ifdef __MACH__
#define getabstime() mach_absolute_time()
#else
static uint64_t
getabstime(void)
{
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
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