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.
125 lines
2.9 KiB
125 lines
2.9 KiB
/*
|
|
* Copyright 2011-2016 Formal Methods and Tools, University of Twente
|
|
* Copyright 2016 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.
|
|
*/
|
|
|
|
/*#include <sylvan_config.h>
|
|
|
|
#include <assert.h>
|
|
#include <inttypes.h>
|
|
#include <math.h>
|
|
#include <pthread.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <sylvan.h>
|
|
#include <sylvan_int.h>
|
|
|
|
#include <avl.h>
|
|
#include <sylvan_refs.h>
|
|
#include <sha2.h>
|
|
*/
|
|
|
|
/**
|
|
* Internals for LDDs
|
|
*/
|
|
|
|
#ifndef SYLVAN_LDD_INT_H
|
|
#define SYLVAN_LDD_INT_H
|
|
|
|
/**
|
|
* LDD node structure
|
|
*
|
|
* RmRR RRRR RRRR VVVV | VVVV DcDD DDDD DDDD (little endian - in memory)
|
|
* VVVV RRRR RRRR RRRm | DDDD DDDD DDDc VVVV (big endian)
|
|
*/
|
|
typedef struct __attribute__((packed)) mddnode {
|
|
uint64_t a, b;
|
|
} * mddnode_t; // 16 bytes
|
|
|
|
#define LDD_GETNODE(mdd) ((mddnode_t)llmsset_index_to_ptr(nodes, mdd))
|
|
|
|
static inline uint32_t __attribute__((unused))
|
|
mddnode_getvalue(mddnode_t n)
|
|
{
|
|
return *(uint32_t*)((uint8_t*)n+6);
|
|
}
|
|
|
|
static inline uint8_t __attribute__((unused))
|
|
mddnode_getmark(mddnode_t n)
|
|
{
|
|
return n->a & 1;
|
|
}
|
|
|
|
static inline uint8_t __attribute__((unused))
|
|
mddnode_getcopy(mddnode_t n)
|
|
{
|
|
return n->b & 0x10000 ? 1 : 0;
|
|
}
|
|
|
|
static inline uint64_t __attribute__((unused))
|
|
mddnode_getright(mddnode_t n)
|
|
{
|
|
return (n->a & 0x0000ffffffffffff) >> 1;
|
|
}
|
|
|
|
static inline uint64_t __attribute__((unused))
|
|
mddnode_getdown(mddnode_t n)
|
|
{
|
|
return n->b >> 17;
|
|
}
|
|
|
|
static inline void __attribute__((unused))
|
|
mddnode_setvalue(mddnode_t n, uint32_t value)
|
|
{
|
|
*(uint32_t*)((uint8_t*)n+6) = value;
|
|
}
|
|
|
|
static inline void __attribute__((unused))
|
|
mddnode_setmark(mddnode_t n, uint8_t mark)
|
|
{
|
|
n->a = (n->a & 0xfffffffffffffffe) | (mark ? 1 : 0);
|
|
}
|
|
|
|
static inline void __attribute__((unused))
|
|
mddnode_setright(mddnode_t n, uint64_t right)
|
|
{
|
|
n->a = (n->a & 0xffff000000000001) | (right << 1);
|
|
}
|
|
|
|
static inline void __attribute__((unused))
|
|
mddnode_setdown(mddnode_t n, uint64_t down)
|
|
{
|
|
n->b = (n->b & 0x000000000001ffff) | (down << 17);
|
|
}
|
|
|
|
static inline void __attribute__((unused))
|
|
mddnode_make(mddnode_t n, uint32_t value, uint64_t right, uint64_t down)
|
|
{
|
|
n->a = right << 1;
|
|
n->b = down << 17;
|
|
*(uint32_t*)((uint8_t*)n+6) = value;
|
|
}
|
|
|
|
static inline void __attribute__((unused))
|
|
mddnode_makecopy(mddnode_t n, uint64_t right, uint64_t down)
|
|
{
|
|
n->a = right << 1;
|
|
n->b = ((down << 1) | 1) << 16;
|
|
}
|
|
|
|
#endif
|