+ def pybind_predecls(cls, code):
+ Addr.pybind_predecls(code)
+ code('#include "base/addr_range.hh"')
+
+ @classmethod
+ def cxx_ini_predecls(cls, code):
+ code('#include <sstream>')
+ code('#include <vector>')
+ code('#include "base/types.hh"')
+
+ @classmethod
+ def cxx_ini_parse(cls, code, src, dest, ret):
+ code('bool _ret = true;')
+ code('uint64_t _start, _end, _intlvMatch = 0;')
+ code('std::vector<Addr> _masks;')
+ code('char _sep;')
+ code('std::istringstream _stream(${src});')
+ code('_stream >> _start;')
+ code('_stream.get(_sep);')
+ code('_ret = _sep == \':\';')
+ code('_stream >> _end;')
+ code('if (!_stream.fail() && !_stream.eof()) {')
+ code(' _stream.get(_sep);')
+ code(' _ret = ret && _sep == \':\';')
+ code(' _stream >> _intlvMatch;')
+ code(' while (!_stream.fail() && !_stream.eof()) {')
+ code(' _stream.get(_sep);')
+ code(' _ret = ret && _sep == \':\';')
+ code(' Addr mask;')
+ code(' _stream >> mask;')
+ code(' _masks.push_back(mask);')
+ code(' }')
+ code('}')
+ code('_ret = _ret && !_stream.fail() && _stream.eof();')
+ code('if (_ret)')
+ code(' ${dest} = AddrRange(_start, _end, _masks, _intlvMatch);')
+ code('${ret} _ret;')