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