./scripts/build.sh
docker run --rm -it riscvcourse/workshop_risc-v <кодовое_название_задания> --mode init --seed <seed>
docker run --rm -it -v <полный путь>/solution.s:/app/solution.s:ro riscvcourse/workshop_risc-v <кодовое_название_задания> --mode check --seed <seed>
где solution.s - исходный код вашего решния (или файл с корректным ответом)
Первый аргумент является позиционным и определяет задание. От задания зависят остальные аргменты, они задаются через флаги. Можно позвать справку --help
, чтобы узнать их. Например lab3_condition --help
выведет аргументы для задания 3. Часть аргументов, таких как mode
(генерация условия или проверка решения), seed
, путь до решения и количество тестов являются общими для всех работ. Т.е. флаг seed
есть во всех реализованных задачах.
Библиотека и main автоматически подтягивают новые работы, нужно только их правильно расположить и правильно назвать.
- Сделать в папке
src/riscv_course
папку по шаблонуlab<N>_<codename>
, где<N>
-- номер работы,<codename>
-- кодовое имя. Дальше работа ведётся только в этой папке. - Сделать фалй с заданием, например,
lab10_test.py
. В этом файле создать классLab10Test
, который наследуется отBaseTaskClass
. - Какие методы нужно переопределить:
__init__
: добавить своих аргументов, добавить инициализацию внутренних параметров, добавить в словарьcheck_files
вспомогательные файлы для проверки (формат: ключ -- имя файла, значение -- содержимое файла)generate_task
-- добавить вызов генерации задания (seed можно получить черезself.seed
) и вернуть строку с текстовым описаннием задания_generate_tests
-- добавить генерацию тестов. Тесты нужно создавать в виде классаTestItem
и добавлять из в список тестовself.tests
check_sol_prereq
-- можно переопределить проверку текста предоставленного задания (наличие ret, метки solution, ...). Можно оставить базовоеcompile
-- если необходимо поменять опции компиляции, то нужно переопределить этот метод и подставить в вызов_compile_internal
нужные аргументы. Без острой необходимости переопределять метод_compile_internal
не рекомендуетсяrun_solution
-- аналогичноcompile
только для запуска скомпилированного решения
- Сделать файл с аргументами cli:
lab10_cli.py
. Определить две функции:add_cli_args_lab<N>
-- принимает парсер отargparse
и добавляет аргументов иcreate_task_lab<N>
-- создаёт объекта класса задания из переданных аргументов cli. В добавлении аргументов обязательно выставить функцию обработки как создание задания:parser.set_defaults(func=create_task_lab<N>)
. Создать парсерCLIParser
, в котором указать функцию для аргументов и название. Важно, чтобы появились общие аргументы (--seed
и прочие), необходимо вызвать функциюadd_common_cli_args
. Важно 2: чтобы одинаково передавать аргументы для базового класса, нужно использовать**get_common_cli_args(args)
в при создании объекта задания. - Сделать файл
__init__.py
, в котором импортировать класс с задание (Lab10Test
) и объект парсера (Lab10CLIParser
), чтобы они были сразу доступны на уровне модуля
После этого работа должна автоматически появится в библиотеке и main. Для примера можно смотреть на работы №1 и №3