Bug #5461
closed
[arrays] Insufficient arrays support
Added by Sergey Smolov almost 10 years ago.
Updated almost 10 years ago.
Published in build:
141226
Description
Реализованная в проекте поддержка массивов имеет два существенных ограничения.
1) radix элементов массива должен совпадать с radix индексов;
2) метод getTypeRadix для MAP всегда возвращает 10.
Эти ограничения, в частности, не позволяют создавать массивы битовых векторов (очень распространенный объект в HDL-описаниях), а также получить для них radix элементов массива.
Проблема 1) частично решена ревизией r715 (теперь все массивы имеют radix=10 для индексов - см. блок TODO), что позволяет успешно обрабатывать код HDL-описаний. Если решение устраивает - можно блок TODO удалить. Если есть необходимость создавать массивы, у которых radix индексов не всегда равен 10, то нужно эту возможность учитывать.
Проблема решится, если использовать основания по умолчанию как определено DataTypeId.radix() (2 for bv and bool, 10 for int and real)? Другими словами, используется ли где-нибудь возможность использовать другие основания при конвертации в строки? Для решения #5462 написан тип, реализующий интерфейс Map<Data, Data>, при использовании которого можно будет гарантировать, что используются основания по умолчанию.
На данный момент были отмечены только массивы из integer'ов с основанием 10 и битовых векторов с основанием 2. Но, чисто теоретически, HDL-описания могут содержать значения с произвольными натуральными основаниями >= 2. Это задача парсера - определить, какое основание используется в данный момент. В Проблеме 2 меня смутило то, что метод всегда возвращает 10.
Издержка интерфейса DataTypeId, так как он требует указание основания для чтения значения из строки и был изначально рассчитан на единственное значение. При использовании оснований по умолчанию MAP.radix() вообще теряет смысл, так как не будет использоваться. Насколько я понимаю, проблемы возникают непосредственно из-за необходимости работы со строками и окажутся скрытыми, если использовать Map для работы с массивами.
Метод radix() вызывается в методе getTypeRadix(), который, собственно, я и пытался использовать (что было, вообще говоря, неверно - он не для моих задач сделан). Раз код метода для MAP - заглушечный - то стоило бы отметить сей факт комментарием. Этим тогда Проблема 2 исчерпывается.
В данном тикете главная и самая существенная проблема - Проблема 1. Она костыльным образом сейчас мной решена. Если решение тебе, как специалисту по массивам, кажется нормальным - то задачу можно считать решенной (меня оно устраивает - в HDL-описаниях не встречаются массивы, у которых индексы не Integer). Если нет - то, видимо, при инициализации массивов надо отдельно передавать основания для индексов и для элементов.
- Priority changed from Normal to High
Что с этой задачей?
В преддверии выпуска нового Fortress настаиваю на её скорейшем решении.
- Status changed from New to Resolved
При инициализации массива из строкового представления используются основания по умолчанию для типов ключей и значений. Основание для составных типов вроде массивов считается неопределённым, методы radix() и getTypeRadix() всегда возвращают 0. Для инициализации массивов рекомендуется использовать класс DataMap (#5462).
- Status changed from Resolved to Verified
- Status changed from Verified to Closed
- % Done changed from 0 to 100
- Published in build set to 141226
Also available in: Atom
PDF