2011-02-07 05:55:31 +01:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2011 Stephen Williams (steve@icarus.com)
|
|
|
|
|
*
|
|
|
|
|
* This source code is free software; you can redistribute it
|
|
|
|
|
* and/or modify it in source code form under the terms of the GNU
|
|
|
|
|
* General Public License as published by the Free Software
|
|
|
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
# include "vtype.h"
|
2011-11-05 23:55:17 +01:00
|
|
|
# include "parse_types.h"
|
2011-04-18 02:19:09 +02:00
|
|
|
# include <map>
|
2011-02-14 04:01:21 +01:00
|
|
|
# include <typeinfo>
|
2012-05-06 00:15:45 +02:00
|
|
|
# include <cassert>
|
2011-02-07 05:55:31 +01:00
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VType::~VType()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-14 04:01:21 +01:00
|
|
|
void VType::show(ostream&out) const
|
|
|
|
|
{
|
|
|
|
|
out << typeid(*this).name();
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-07 05:55:31 +01:00
|
|
|
VTypePrimitive::VTypePrimitive(VTypePrimitive::type_t tt)
|
|
|
|
|
: type_(tt)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VTypePrimitive::~VTypePrimitive()
|
|
|
|
|
{
|
|
|
|
|
}
|
2011-02-14 01:37:10 +01:00
|
|
|
|
2011-02-14 04:01:21 +01:00
|
|
|
void VTypePrimitive::show(ostream&out) const
|
|
|
|
|
{
|
|
|
|
|
switch (type_) {
|
|
|
|
|
case BOOLEAN:
|
|
|
|
|
out << "BOOLEAN";
|
|
|
|
|
break;
|
|
|
|
|
case BIT:
|
|
|
|
|
out << "BIT";
|
|
|
|
|
break;
|
|
|
|
|
case INTEGER:
|
|
|
|
|
out << "INTEGER";
|
|
|
|
|
break;
|
|
|
|
|
case STDLOGIC:
|
|
|
|
|
out << "std_logic";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-26 05:09:31 +01:00
|
|
|
VTypeArray::VTypeArray(const VType*element, const vector<VTypeArray::range_t>&r, bool sv)
|
|
|
|
|
: etype_(element), ranges_(r), signed_flag_(sv)
|
2011-02-14 01:37:10 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-05 23:55:17 +01:00
|
|
|
/*
|
|
|
|
|
* Create a VTypeArray range set from a list of parsed ranges.
|
|
|
|
|
* FIXME: We are copying pointers from the prange_t object into the
|
|
|
|
|
* range_t. This means that we cannot delete the prange_t object
|
|
|
|
|
* unless we invent a way to remove the pointers from that object. So
|
|
|
|
|
* this is a memory leak. Something to fix.
|
|
|
|
|
*/
|
|
|
|
|
VTypeArray::VTypeArray(const VType*element, std::list<prange_t*>*r, bool sv)
|
|
|
|
|
: etype_(element), ranges_(r->size()), signed_flag_(sv)
|
|
|
|
|
{
|
|
|
|
|
for (size_t idx = 0 ; idx < ranges_.size() ; idx += 1) {
|
|
|
|
|
prange_t*curp = r->front();
|
|
|
|
|
r->pop_front();
|
|
|
|
|
Expression*msb = curp->msb();
|
|
|
|
|
Expression*lsb = curp->lsb();
|
|
|
|
|
ranges_[idx] = range_t(msb, lsb);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-02-14 01:37:10 +01:00
|
|
|
VTypeArray::~VTypeArray()
|
|
|
|
|
{
|
|
|
|
|
}
|
2011-02-14 04:01:21 +01:00
|
|
|
|
|
|
|
|
size_t VTypeArray::dimensions() const
|
|
|
|
|
{
|
|
|
|
|
return ranges_.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const VType* VTypeArray::element_type() const
|
|
|
|
|
{
|
|
|
|
|
return etype_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VTypeArray::show(ostream&out) const
|
|
|
|
|
{
|
|
|
|
|
out << "array ";
|
|
|
|
|
for (vector<range_t>::const_iterator cur = ranges_.begin()
|
|
|
|
|
; cur != ranges_.end() ; ++cur) {
|
2011-11-06 01:22:30 +01:00
|
|
|
out << "(";
|
|
|
|
|
if (cur->msb())
|
|
|
|
|
cur->msb()->write_to_stream(out);
|
|
|
|
|
else
|
|
|
|
|
out << "<>";
|
|
|
|
|
out << " downto ";
|
|
|
|
|
if (cur->lsb())
|
|
|
|
|
cur->lsb()->write_to_stream(out);
|
|
|
|
|
else
|
|
|
|
|
out << "<>";
|
|
|
|
|
out << ")";
|
2011-02-14 04:01:21 +01:00
|
|
|
}
|
|
|
|
|
out << " of ";
|
2011-02-26 05:09:31 +01:00
|
|
|
if (signed_flag_)
|
|
|
|
|
out << "signed ";
|
2011-02-14 04:01:21 +01:00
|
|
|
if (etype_)
|
|
|
|
|
etype_->show(out);
|
|
|
|
|
else
|
|
|
|
|
out << "<nil>";
|
|
|
|
|
}
|
2011-04-18 02:19:09 +02:00
|
|
|
|
|
|
|
|
VTypeRange::VTypeRange(const VType*base, int64_t max_val, int64_t min_val)
|
|
|
|
|
: base_(base)
|
|
|
|
|
{
|
|
|
|
|
max_ = max_val;
|
|
|
|
|
min_ = min_val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VTypeRange::~VTypeRange()
|
|
|
|
|
{
|
|
|
|
|
}
|
2011-10-02 02:04:04 +02:00
|
|
|
|
|
|
|
|
VTypeEnum::VTypeEnum(const std::list<perm_string>*names)
|
|
|
|
|
: names_(names->size())
|
|
|
|
|
{
|
|
|
|
|
size_t idx = 0;
|
|
|
|
|
|
|
|
|
|
for (list<perm_string>::const_iterator cur = names->begin()
|
|
|
|
|
; cur != names->end() ; ++cur, ++idx) {
|
|
|
|
|
names_[idx] = *cur;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VTypeEnum::~VTypeEnum()
|
|
|
|
|
{
|
|
|
|
|
}
|
2011-10-10 00:25:35 +02:00
|
|
|
|
|
|
|
|
void VTypeEnum::show(ostream&out) const
|
|
|
|
|
{
|
|
|
|
|
out << "(";
|
|
|
|
|
if (names_.size() >= 1)
|
|
|
|
|
out << names_[0];
|
|
|
|
|
for (size_t idx = 1 ; idx < names_.size() ; idx += 1)
|
|
|
|
|
out << ", " << names_[idx];
|
|
|
|
|
out << ")";
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-17 23:03:19 +01:00
|
|
|
VTypeRecord::VTypeRecord(std::list<element_t*>*elements)
|
|
|
|
|
: elements_(elements->size())
|
|
|
|
|
{
|
|
|
|
|
for (size_t idx = 0 ; idx < elements_.size() ; idx += 1) {
|
|
|
|
|
elements_[idx] = elements->front();
|
|
|
|
|
elements->pop_front();
|
|
|
|
|
}
|
|
|
|
|
delete elements;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VTypeRecord::~VTypeRecord()
|
|
|
|
|
{
|
|
|
|
|
for (size_t idx = 0 ; idx < elements_.size() ; idx += 1)
|
|
|
|
|
delete elements_[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VTypeRecord::show(ostream&out) const
|
|
|
|
|
{
|
2012-03-18 19:21:23 +01:00
|
|
|
write_to_stream(out);
|
2012-03-17 23:03:19 +01:00
|
|
|
}
|
|
|
|
|
|
2012-04-02 03:48:19 +02:00
|
|
|
const VTypeRecord::element_t* VTypeRecord::element_by_name(perm_string name) const
|
|
|
|
|
{
|
|
|
|
|
for (vector<element_t*>::const_iterator cur = elements_.begin()
|
|
|
|
|
; cur != elements_.end() ; ++cur) {
|
|
|
|
|
element_t*curp = *cur;
|
|
|
|
|
if (curp->peek_name() == name)
|
|
|
|
|
return curp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-17 23:03:19 +01:00
|
|
|
VTypeRecord::element_t::element_t(perm_string name, const VType*typ)
|
|
|
|
|
: name_(name), type_(typ)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2012-05-06 00:15:45 +02:00
|
|
|
VTypeDef::VTypeDef(perm_string nam)
|
|
|
|
|
: name_(nam), type_(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-10 00:25:35 +02:00
|
|
|
VTypeDef::VTypeDef(perm_string nam, const VType*typ)
|
|
|
|
|
: name_(nam), type_(typ)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VTypeDef::~VTypeDef()
|
|
|
|
|
{
|
|
|
|
|
}
|
2012-05-06 00:15:45 +02:00
|
|
|
|
|
|
|
|
void VTypeDef::set_definition(const VType*typ)
|
|
|
|
|
{
|
|
|
|
|
assert(type_ == 0);
|
|
|
|
|
type_ = typ;
|
|
|
|
|
}
|